1. int base = 0;
  2. // 定义常量(类中的只读变量 只能且必须 在初始化列表中initialize)
  3. // const常量只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以const定义的常量
  4. // 在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
  5. const int a1 = 1; // 编译器可以对它进行类型安全检查(宏常量只是简单的替换,可能会产生意料不到的错误)
  6. int const a2 = 1;
  7. // 修饰指针
  8. int * const b1 = &base;
  9. // 同时修饰值和指针
  10. int const * const c1 = &base;
  11. const int * const c2 = &base; // const修饰记忆:关键字左边的,本身在最左边时修饰右边

 

  1. class Code
  2. {
  3. CString m_code;
  4. public:
  5. Code() {}
  6. ~Code() {}
  7. const CString* getCode(const CString& src)const;
  8. void setCode(const CString& src);
  9. };
    void Code::setCode(const CString& src)
  10. {
  11. m_code = src;
  12. }
  13. const CString* Code::getCode(const CString& src) const
  14. {
  15. // error
  16. //src = result; // const修饰的变量只读,且在只读函数内
  17. //m_code = src; // const修饰的类成员函数 不能修改成员
  18. //setCode(src); // const修饰的类成员函数 只能调用只读成员函数
  19. return &m_code;
  20. }

getCode()函数的返回值必须用 const CString* re = code.getCode( _T(“GB1001”) );  或者写成 auto re = code.getCode( _T(“GB1001”) );

 

这种只读的保证是编译器做的限制,少数情况下要在只读函数内修改对象的属性,可以这么做:

  1. const CString* Code::getCode(const CString& src) const
  2. {
  3. // 1.mutable关键字修饰 mutable int value;
  4. // 2.绕过编译器的限制
  5. Code* p = (Code*)this; // 关键在于this强转为Code*
  6. p->setCode(src);
  7. return &m_code;
  8. }
  1. void Code::fun(int a)const // 可以重载,根据对象是否只读区别
  2. {}
  3. void Code::fun(int a)
  4. {}
  5. void Code::fun(const int a) // 无法重载
  6. {}
  7. void Code::fun(int a)
  8. {}

 

const修饰的对象只能访问 类中的只读函数,不能修改变量。较好的设计应该是用const限定方法,不限定对象,类中的属性只能通过方法 Get() 或 Set() 

 

 

 

C++中的const一般被看成编译期的常量,不为const分配空间, 只是在编译的时候将值保存在符号表中,并在适当的时候折合在代码中
C++中, 是否为const分配空间要看具体情况,若加上关键字extern或者取const变量地址,编译器就要为const分配存储空间
C语言中的const是一个不能被改变的普通变量,会占用存储空间

  1. const int size = 10;
  2. int array[size] = { 0 }; // C语言中error: 编译器不知道编译时的值(数组下标必须明确)

 

  1. // const_cast用来移除变量的const或volatile限定符:
  2. // 使用const_cast再写的后果是未定义的,const_cast的目的并不是为了让你去修改一个本身被定义为const的值,
  3. // 因为这样做的后果是无法预期的。const_cast的目的是修改一些指针/引用的权限,
  4. // 如果我们原本无法通过这些指针/引用修改某块内存的值,现在你可以了。
  5. const int a = 1;
  6. //int* temp = a; // error
  7. int* pa1 = const_cast<int*>(&a); // 去除const限制
  8. int* pa2 = (int*)&a; // 传统方式去除const限定
  9.  
  10. *pa1 = 10;
  11. int modify1 = a; // 1,这里直接被替换成常量表达式,不再从地址中取值(const常量引入的初衷是替代#define)
  12.  
  13. *pa2 = 100;
  14. int modify2 = a; // 1

 

版权声明:本文为zifeiye原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zifeiye/p/8214113.html