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){} }
const常量只能通过初始化列表的方式进行初始化。
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修饰指针
我们看一下下面四种写法:
1) const int* a = 10; 2) int const *a = 10; 3) int* const a = 10; 4) 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)修饰函数参数
void fun0(const Test* p_test); void fun1(const Test& test);
在传入的参数前,加上const,表明传入的参数不可修改。
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(); }