C++常数据成员精讲—const关键字

来源:互联网 发布:手机温度计软件 编辑:程序博客网 时间:2024/05/23 20:16
 
分类: c++ 937人阅读 评论(0) 收藏 举报
c++systemclassc

用const修士的定义对象成为常对象;(两种声明方式)

[cpp] view plaincopy
  1. const Point point1( 10,10);//常量对象  
  2.     Point const point2( 10,10);//常量对象  
用const修饰的声明成员函数成为常成员函数;
[cpp] view plaincopy
  1. class Point  
  2. {  
  3.     int x, y;  
  4. public:  
  5.     Point(int a, int b) { x=a; y=b;}  
  6.     void MovePoint( int a, int b){ x+=a; y+=b;}  
  7.     void print() const { cout<<"x="<<x<<"y="<<y<<endl;}  
  8. };  
用const修饰的声明数据成员成为常数据成员;
注意:变量或对象被const修饰后其值不能被更新(除非数据成员被mutable修饰时,可以被修改)。因此被const修饰的变量或者对象要进行初始化。

说明: 
   1 任何函数能对常数据成员赋值
    2 构造函数对常数据成员进行初始化时也只能通过初始化列表进行。
    3 常数据成员在定义时必须赋值或称为必须初始化。
    4 如果累有多个默认构造函数必须都初始化常数据成员。
通过下面例子来理解常数据成员:(借用网友实例)
[cpp] view plaincopy
  1. class A  
  2. {  
  3. private:  
  4. int w,h;  
  5.       const int cctwl=5;  //错误一  
  6. public:  
  7. };  
  8. void main()  
  9. {     
  10.         A a ;   //错误二     
  11.     cout<< "sss";  
  12.          system("pause");  
  13. }  
  14. 错误一:不能对常数据成员在类中初始化、要通过类的构造函数,只有静态常量才能这样初始化。  
  15. 错误二:没有合适的默认构造函数可用。因为有常量cctwl没有初始化必须初始化所有常数据成员。  
多个构造函数下的常数据成员
[cpp] view plaincopy
  1. class A{  
  2. private:  
  3.     int w,h;  
  4.      const int  cctwl;  
  5. public:  
  6.     const int cct;  
  7.     A():cctwl(5),cct(6){};  
  8.       
  9. A(int x,int y) //错误一      
  10. {  
  11.          w=x,h=y;  
  12.     }  
  13. };  
  14. void main()  
  15. {  
  16.     A a ;  
  17.     A b(3,8);  
  18.     cout<< "sss";  
  19.     system("pause");  
  20. }  
  21. 错误一:每个构造函数都要初始化常数据成员应改为  
  22. A(int x,int y):cctwl(7),cct(8)  
  23.  {  
  24.     w=x,h=y;  
  25.  }  
c++ 常成员函数
声明: <类型标识符> 函数名(参数列表) const;

说明: 

(1)const是函数类型的一部分,在实现部分也要带该关键字。

(2)const关键字可以用于对重载函数的区分。

(3)常成员函数不能更新任何数据成员,也不能调用该类中没有用const修饰的成员函数,只能调用常成员函数和常数据成员

下面是相应的实例(借用网友):
[cpp] view plaincopy
  1. A、通过例子来理解const是函数类型的一部分,在实现部分也要带该关键字。  
  2. class A{  
  3. private:  
  4.     int w,h;  
  5. public:  
  6.     int getValue() const;  
  7.     int getValue();  
  8.     A(int x,int y)  
  9.     {  
  10.         w=x,h=y;  
  11.     }  
  12.     A(){}  
  13. };  
  14. int A::getValue() const    //实现部分也带该关键字  
  15. {  
  16.     return w*h; //????  
  17. }  
  18. void main()  
  19. {  
  20.     A const a(3,4);  
  21.     A c(2,6);  
  22. cout<<a.getValue()<<c.getValue()<<"cctwlTest";   
  23. system("pause");  
  24. }  
  25. B、通过例子来理解const关键字的重载  
  26. class A{  
  27. private:  
  28.     int w,h;  
  29. public:  
  30. int getValue() const  
  31. {  
  32.         return w*h;  
  33.     }  
  34.     int getValue(){  
  35.         return w+h;  
  36.     }  
  37.     A(int x,int y)  
  38.     {  
  39.         w=x,h=y;  
  40.     }  
  41.     A(){}  
  42. };  
  43. void main()  
  44. {     
  45.     A const a(3,4);  
  46.     A  c(2,6);  
  47.     cout<<a.getValue()<<c.getValue()<<"cctwlTest"//输出12和8  
  48.     system("pause");  
  49. }  
  50. C、通过例子来理解常成员函数不能更新任何数据成员  
  51. class A{  
  52. private:  
  53.     int w,h;  
  54. public:  
  55.     int getValue() const;  
  56.     int getValue();  
  57.     A(int x,int y)  
  58.     {  
  59.         w=x,h=y;  
  60.     }  
  61.     A(){}  
  62. };  
  63. int A::getValue() const  
  64. {  
  65.     w=10,h=10;//错误,因为常成员函数不能更新任何数据成员  
  66.     return w*h;  
  67. }  
  68. int A::getValue()  
  69. {  
  70.     w=10,h=10;//可以更新数据成员  
  71.     return w+h;  
  72. }  
  73. void main()  
  74. {  
  75.      A const a(3,4);  
  76.     A  c(2,6);  
  77.     cout<<a.getValue()<<endl<<c.getValue()<<"cctwlTest";                           system("pause");  
  78. }  
  79. D、通过例子来理解  
  80. 1、常成员函数可以被其他成员函数调用。  
  81. 2、但是不能调用其他非常成员函数。  
  82. 3、可以调用其他常成员函数。  
  83. class A{  
  84. private:  
  85.     int w,h;  
  86. public:  
  87.     int getValue() const  
  88.  {  
  89.    return w*h + getValue2();//错误的不能调用其他非常成员函数。  
  90.  }  
  91.     int getValue2()  
  92.     {  
  93.           
  94.         return w+h+getValue();//正确可以调用常成员函数  
  95.     }  
  96.       
  97.     A(int x,int y)  
  98.     {  
  99.         w=x,h=y;  
  100.     }  
  101.     A(){}  
  102. };  
  103. void main()  
  104. {  
  105.     A const a(3,4);  
  106.     A       c(2,6);  
  107. cout<<a.getValue()<<endl<<c.getValue2()<<"cctwlTest";                     
  108. system("pause");  
  109. }  
0 0
原创粉丝点击