首页 > 代码库 > c++ const详解

c++ const详解

0x01:const常量
1 const int num = 10;2 int a[num] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };3 cout << sizeof(a) << endl;//sizeof(a) 为 40

 

 C++编译器对const做了优化,引用常量的地方,直接替换常量,不读内存,读取常量符号表
const int num = 10;int *p = const_cast<int *>(&num);*p = 5;cout << num << endl;//打印结果 10cout << *p << endl;//打印结果 5cin.get();//C++编译器对const做了优化,引用常量的地方,直接替换常量,不读内存,读取常量符号表
const变量,在内存,可以修改,不能生效,C语言读取内存的值,c++不读内存


0x02:const数组
 1 const int a[5] = { 1, 2, 3, 4, 5 }; 2  3 for (int *p = const_cast<int *>(a); p<a + 5; p++) 4 { 5     *p += 1; 6 } 7  8 for (int i = 0; i < 5; i++) 9 {10     cout << a[i] << endl;11 }12 cin.get();
结果为:

//单个的常量,C++不读内存,读常量符号表
//常量数组,C++读内存

 

 

 

0x03:const参数

1 void print( const int x)//不能给常量赋值,const作为参数,表明权限问题,在函数内不可以修改2 {3     //x = 10;//不能给常量赋值4 }

const作为参数表权限问题,在函数内不可以修改,杜绝你随便乱玩。

0x04:const引用

1 void print(const int & rnum)//引用一个变量,限定在函数内不可以修改

 

1 int num = 100;2 3 const int & rnum = num;//引用的数据,不能通过引用名来修改4 5 int const& rnum = num;//如果const在右边,编译器会忽略&右边的const

 

0x05:const与类
 1 //构造,析构函数,不可以加上const修饰符 2 class MyClass 3 { 4 public: 5     int x; 6     int y; 7     MyClass() :x(10), y(100) 8     { 9 10     }11     ~MyClass() 12     {13 14     }15     void set()  16     {17         x = 101;18         y = 10 + x;19     }20     int get() const21     {22         return x + y;23     }24 };25 26 void  main()27 {28     const MyClass *p ( new MyClass);29     p->get();//const对象,只能读成员,不可以写成员30 }

\const成员没有初始化的情况下,可以被构造函数初始化
 1 class MyClass 2 { 3 public: 4     int x; 5     const int y;//const成员没有初始化的情况下,可以被构造函数初始化,即使有初始值也可以被构造函数初始化 6     MyClass(int a, int b,) :x(a), y(b) 7     { 8  9     }10     ~MyClass() 11     {12 13     }14     void set()  15     {16         x = 101;17         y = 10 + x;18     }19     int get() const20     {21         return x + y;22     }23 24 private:25 26 };

//类的成员是const不能被成员函数修改
class MyClass{public:    const int x;    const int y;    MyClass() :x(10), y(100)    {    }    ~MyClass()     {    }    void set()  //类的成员是const不能被成员函数修改    {        x = 101;        y = 10 + x;    }};
1 myclass my1(100,200);2 cout << my1.x << endl;3 4 const int *p = &my1.x;//取变量地址5 int *px = const_cast<int *>(p);//变化指针6 *px = 123;7 8 cout << my1.x << endl;//123 类的成员是const常量,可以去掉const属性修改

 

(1)类的成员是const
1.const没有初始化的情况,可以被构造初始化,即使有初始值,也可可以被构造函数初始化赋值
2.类的成员是const,不可以被成员函数更改,可以读取
3.类的成员是const常量,可以去掉const属性修改

(2)类的成员函数const,限定不可以修改类的成员变量,只能读

(3)类的成员函数参数前面有const,参数只能读,不能改

(4)const如果作为类成员函数参数的返回类型修饰符,作为指针的话,限定只能通过这个指针读,不可以写。

0x06:const指针
const在*号左边,限定指向的数据不可以改,可以改变指向
1 const int *p(new int(5));//const在*号左边,限定指向的数据不可以改,可以改变指向2 //*p = 3;const在*号左边,限定指向的数据不可以改3 p = new int(10);//可以改变指向

 

const在*右边,限定指针的指向不可以改变,可以改变指针指向的数据
int * const p(new int(5));//const在*右边,限定指针的指向不可以改变,可以改变指针指向的数据*p = 3;//可以改变指针指向的数据//p = new int(10);const在*右边,限定指针的指向不可以改变

 

p是一个指向常量的常量指针,指向的数据和指针的指向都不可以修改
1 int const * const p(new int(5));2 //p是一个指向常量的常量指针,指向的数据和指针的指向都不可以修改

 




c++ const详解