aihot  2020-11-12 09:25:11  OpenCV |   查看评论   
ok 7 const int *p4 = &ci; // ok

 还有一种指向const对象的const指针,这种指针首先表明,本身是一个const指针,一旦初始化后不能指向其他对象;其次,它本身所指向的对象也是一个常量,即不能通过指针修改对象的值。

const int var = 42; const int* const p = &var;

这里再强调一点,const只是给编译器看的,我们可以很轻松的骗过编译器,并看看编译器都做了什么:

1 const int var = 42; 2 int* p = (int*)&var; 3 *p = 20; 4 cout << var << endl;     //42
5 cout << *p << endl;     //20

我们在代码的第2行,用一个类型转换强制的,把一个非const指针指向了一个const对象。

但是后面我们通过这个指针来修改这个值,却没有生效,原因呢?

那是因为编译器在编译阶段发现var是一个常量,所以在编译目标代码时已经将var的地方都用42进行了替换。

六、const与类

其实类定义的对象,与普通的变量是一样的,用const修饰时,说明这个类是一个常量类对象,这个对象有下面2个特点:

1)不能改变其成员变量(非mutalbe成员)

2)不能调用其非const成员函数

 1 class AClass{  2     public:  3         int m_var;  4         mutable int m_mutable_var;  5         void setVar(int var){ m_var = var; }  6         void printVar(){ cout << m_var; }  7         void printVar_const()const { cout << m_var; }  8     };  9 
10     const AClass ac; 11     ac.m_var = 20; // Error:ac是一个const类,不能修改成员变量
12     ac.m_mutable_var = 42; // ok 可以修改mutable修饰的变量
13     ac.setVar(20); //            
          
 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自C++的那些事:const用法面面观

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]