1.const常量和宏常量
const int max=100;#define max 100;
const常量相对宏常量有两个有点:
1)有类型安全检查
2)占用内存空间少
2.const变量在内存中的位置
我们在C程序的内存布局中,已经通过示例进行了说明
#include <stdio.h>const int a = 10; 全部常量aint main(){const int b = 20; //局部常量bint* 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;//正常,访问公共成员aa_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();}
