1.const常量和宏常量
const int max=100;
#define max 100;
const常量相对宏常量有两个有点:
1)有类型安全检查
2)占用内存空间少
2.const变量在内存中的位置
我们在C程序的内存布局中,已经通过示例进行了说明
#include <stdio.h>
const int a = 10; 全部常量a
int main()
{
const int b = 20; //局部常量b
int* pa = (int*)&a;//报错,因为全部常量放在只读数据段
int* pb = (int*)&b;//修改成功,因为局部常量放在栈上
*pa = 30;
*pb = 30;
return 0;
}
3.const常成员变量的初始化
在某个对象生存期内是常量。
class Test
{
public:
const int a;
Test(int i):a(i){}
}
4.const修饰对象
该对象不能修改。只能访问成员变量,不能修改。只能调用常成员函数。
关于常成员函数,我们在后面介绍。
如下例所示:
#include<iostream>
class Test
{
public:
int a;
void fun0(){}
void fun1() const{}
};
int main()
{
Test test;
const Test& a_test = test;
std::cout<<a_test.a<<std::endl;//正常,访问公共成员a
a_test.fun0();//报错,对象包含与成员函数不兼容的类型限定符
a_test.fun1();//正常
return 0;
}
5.const修饰指针
我们看一下下面四种写法:
const int* a = 10;
int const *a = 10;
int* const a = 10;
const int* const a = 10;
我们需要知道的是,
const在左,表示指针指向的内容为常量,这也是我们平时说的常量指针
const在右,表示指针本身为常量,这也是我们平时说的指针常量
因此,1),2)表示指针a指向的内容不能修改
3)表示指针a本身不能修改
4)表示指针a和a指向的内容都不能修改
6.const修饰成员函数,函数参数,返回值
1)修饰成员函数
void fun1() const;
成员函数名后加上const,即表明该函数为常成员函数。
常成员函数的const隐式修饰this指针,即对象不可修改,
所以,常成员函数只能访问成员变量,而不能修改。只能调用其他常成员函数。
如下例所示:
int g_a;
void g_fun(){}
class Test
{
public:
void fun0(){}
void fun1() const{}
void fun2() const
{
a = 10;//报错,“必须是可修改的左值”
fun0();//报错,对象包含与成员函数不兼容的类型限定符
fun1();//正常,可调用其他常成员函数
g_a = 10;//正常
g_fun();//正常
}
private:
int a;
}
2)修饰函数参数
在传入的参数前,加上const,表明传入的参数不可修改。
void fun0(const Test* p_test);
void fun1(const Test& test);
3)修饰函数返回值
const Test fun0();
const Test* fun1();
当使用const Test* fun1();返回指针时,该返回值只能赋给const修饰的同类型指针。
class Test
{
public:
void fun0(){}
const Test fun1(){
return *this;
}
const Test* fun2(){
return this;
}
};
int main()
{
Test test;
Test r = test.fun1();
const Test* rp = test.fun2();
}