关于C++ const 的全面总结

本文探讨了C++中const变量的内存分配及初始化时机,特别是在类中的使用方式。通过对比不同初始化方法,展示了正确的初始化位置及其原因。

原文出处:http://blog.youkuaiyun.com/zhouyelihua

我们知道在c++中const定义的变量一般是不分配内存的,和C语言中的#define。但是在c语言中const是默认分配的。

但是当我们的类中有const定义的数据时候,一般是要进行内存分配的。因为在const定义的变量一般是进行初始化操作的。不然就会报错。那什么时候对类中定义的变量进行初始化呢?


在类中定义const变量有以下两个好处:

1.静态数据成员没有进入程序的全局名字空间,因此不存在与程序中的其他全局名字冲突的可能性。

2.可以实现信息的隐藏。

[cpp]  view plain  copy
 print ?
  1. #include<iostream>  
  2. using namespace std;  
  3. class sb{  
  4.     private:  
  5.         const int i=5;  
  6.         public:  
  7.       
  8.             void print();  
  9. };  
  10.   
  11. void sb::print()  
  12. {  
  13.     cout<<i<<endl;  
  14. }  
  15. int main()  
  16. {  
  17.   
  18.     cout<<"sizeof class sb="<<sizeof(sb)<<endl;  
  19.     sb sb1;  
  20.       
  21.     sb1.print();  
  22.     return 0;  
  23. }  

上面的代码和下面的代码是一样的。下面的代码还节约内存

[cpp]  view plain  copy
 print ?
  1. #include<iostream>  
  2. using namespace std;  
  3. class sb{  
  4.   
  5.       
  6.         public:  
  7.       
  8.             void print();  
  9. };  
  10.   
  11. void sb::print()  
  12. {  
  13.     cout<<5<<endl;  
  14. }  
  15. int main()  
  16. {  
  17.   
  18.     cout<<"sizeof class sb="<<sizeof(sb)<<endl;  
  19.     sb sb1;  
  20.       
  21.     sb1.print();  
  22.     return 0;  
  23. }  

所以上面在类中直接定义是没有意义的。我们知道在类创立的时候我们最先执行的就是构造函数。但是是在构造函数中定义?这个也是错误的必须在构造函数体执行之前定义的,也就是在函数调用列表中定义的。具体如下

[cpp]  view plain  copy
 print ?
  1. #include<iostream>  
  2. using namespace std;  
  3. class sb{  
  4.     private:  
  5.         const int i;  
  6.         public:  
  7.         sb(int ii);  
  8.             void print();  
  9. };  
  10. sb::sb(int ii):i(ii){}  
  11. void sb::print()  
  12. {  
  13.     cout<<i<<endl;  
  14. }  
  15. int main()  
  16. {  
  17.     sb sb1(1);  
  18.     cout<<"sizeof class sb="<<sizeof(sb)<<endl;  
  19.   
  20.       
  21.     sb1.print();  
  22.     return 0;  
  23. }  

而上文中的

[cpp]  view plain  copy
 print ?
  1. sb::sb(int ii):i(ii){}  

如果改为

[cpp]  view plain  copy
 print ?
  1. sb::sb(int ii){  
  2. i=ii;  
  3. }  
则会报错的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值