C++ const使用详解

1.const常量和宏常量

  1. const int max=100;
  2. #define max 100;

const常量相对宏常量有两个有点:
1)有类型安全检查
2)占用内存空间少

2.const变量在内存中的位置

我们在C程序的内存布局中,已经通过示例进行了说明

  1. #include <stdio.h>
  2. const int a = 10; 全部常量a
  3. int main()
  4. {
  5. const int b = 20; //局部常量b
  6. int* pa = (int*)&a;//报错,因为全部常量放在只读数据段
  7. int* pb = (int*)&b;//修改成功,因为局部常量放在栈上
  8. *pa = 30;
  9. *pb = 30;
  10. return 0;
  11. }

3.const常成员变量的初始化

在某个对象生存期内是常量。

  1. class Test
  2. {
  3. public:
  4. const int a;
  5. Test(int i):a(i){}
  6. }

4.const修饰对象

该对象不能修改。只能访问成员变量,不能修改。只能调用常成员函数。
关于常成员函数,我们在后面介绍。
如下例所示:

  1. #include<iostream>
  2. class Test
  3. {
  4. public:
  5. int a;
  6. void fun0(){}
  7. void fun1() const{}
  8. };
  9. int main()
  10. {
  11. Test test;
  12. const Test& a_test = test;
  13. std::cout<<a_test.a<<std::endl;//正常,访问公共成员a
  14. a_test.fun0();//报错,对象包含与成员函数不兼容的类型限定符
  15. a_test.fun1();//正常
  16. return 0;
  17. }

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)修饰成员函数
  1. void fun1() const;

成员函数名后加上const,即表明该函数为常成员函数。
常成员函数的const隐式修饰this指针,即对象不可修改,
所以,常成员函数只能访问成员变量,而不能修改。只能调用其他常成员函数。
如下例所示:

  1. int g_a;
  2. void g_fun(){}
  3. class Test
  4. {
  5. public:
  6. void fun0(){}
  7. void fun1() const{}
  8. void fun2() const
  9. {
  10. a = 10;//报错,“必须是可修改的左值”
  11. fun0();//报错,对象包含与成员函数不兼容的类型限定符
  12. fun1();//正常,可调用其他常成员函数
  13. g_a = 10;//正常
  14. g_fun();//正常
  15. }
  16. private:
  17. int a;
  18. }

2)修饰函数参数

在传入的参数前,加上const,表明传入的参数不可修改。

  1. void fun0(const Test* p_test);
  2. void fun1(const Test& test);

3)修饰函数返回值
  1. const Test fun0();
  2. const Test* fun1();

当使用const Test* fun1();返回指针时,该返回值只能赋给const修饰的同类型指针。

  1. class Test
  2. {
  3. public:
  4. void fun0(){}
  5. const Test fun1(){
  6. return *this;
  7. }
  8. const Test* fun2(){
  9. return this;
  10. }
  11. };
  12. int main()
  13. {
  14. Test test;
  15. Test r = test.fun1();
  16. const Test* rp = test.fun2();
  17. }