C++基础#3:const用法详细介绍

Myth丶恋晨 2023-10-16 21:53 39阅读 0赞

本篇描述了const数据成员在类中的定义及其访问规则。

1. const数据成员的初始化:
(1) 在对象层次上,常量几乎没有任何意义,因此const数据成员通常也是静态的,即用static const来修饰而不是const;
(2) 正如static数据成员一样,satic const数据成员也必须在源文件中为其分配空间并进行初始化,也是最后一次对其赋值的机会。 另外,C++规定,如果数据成员是简单类型(如int,char…..),则允许程序员在声明的同时进行赋值;

(3) 如果真的只用const 而不是static的话,那么,必须在构造函数中以初始化列表的形式对这个const数据成员进行初始化。

例:

  1. #include <stdio.h>
  2. class MaxDefine{
  3. private:
  4. int x;
  5. public:
  6. //const int MaxDefine_10 = 10; //compiler error: ISO C++ forbids initialization of member `MaxDefine_10'
  7. const int MaxDefine_100;
  8. static const int MaxDefine_1000;
  9. static const int MaxDefine_10000 = 10000;
  10. public:
  11. MaxDefine(int value ): MaxDefine_100(value) //必须以这样的初始化列表的形式来进行初始化
  12. {
  13. // MaxDefine_100 = value;//不能这样做,这种写法相当于对常量进行赋值,这不允许,除非是声明的同时进行赋值。
  14. }
  15. };
  16. int const MaxDefine::MaxDefine_1000 = 1000;
  17. void TestMaxDef(void)
  18. {
  19. MaxDefine m100(100);
  20. printf(" m100.MaxDefine_100 = %d /n", m100.MaxDefine_100); // OK: m100.MaxDefine_100 = 100
  21. printf(" m100.MaxDefine_100 = %d /n", MaxDefine.MaxDefine_100); //expected primary-expression before '.' token. 因为MaxDefine_100属于对象而不属于类。
  22. printf(" MaxDefine::MaxDefine_1000 = %d /n", MaxDefine::MaxDefine_1000); // OK: MaxDefine::MaxDefine_1000 = 1000
  23. printf(" MaxDefine::MaxDefine_10000 = %d /n", MaxDefine::MaxDefine_10000);//OK: MaxDefine::MaxDefine_10000 = 10000
  24. }
  25. int main(void)
  26. {
  27. TestMaxDef();
  28. while(1);
  29. return 0;
  30. }
  31. //result:
  32. /* MaxDefine::MaxDefine_1000 = 1000;
  33. MaxDefine::MaxDefine_10000 = 10000;
  34. */

代码说明:

(1) compiler error: ISO C++ forbids initialization of member `MaxDefine_10’:

不能对数据成员在初始化时进行赋值操作,即使赋值0也不可以。

2. const数据成员与const成员函数:
(1)不能将静态方法声明为const,因为这是多余的。静态方法根本没有相应的类实例,因此它们不可能修改内部值。
(2)非const对象可以调用const和非const方法,但是,const对象只能调用const方法。

例:

  1. #include <stdio.h>
  2. class Widget {
  3. private:
  4. int h; //height
  5. int w; //width
  6. static const int hMax = 320;
  7. static const int wMax = 240;
  8. public:
  9. Widget(int height, int width):
  10. h(height < hMax ? height: hMax),
  11. w(width < wMax ? width: wMax)
  12. {
  13. //nothing
  14. }
  15. int get_height() const;
  16. int get_width() const;
  17. void printSize()
  18. {
  19. printf(" printSize: height = %d /n", h);
  20. printf(" printSize: height = %d /n", w);
  21. }
  22. };
  23. int Widget::get_height() const { return h; }
  24. int Widget::get_width() const { return w; }
  25. int main(void)
  26. {
  27. Widget window(128, 240);
  28. const Widget window2(116,116);
  29. printf(" window.get_height() = %d /n", window.get_height());
  30. printf(" window.get_width() = %d /n", window.get_width());
  31. window.printSize();
  32. printf("/n");
  33. printf(" window2.get_height() = %d /n", window2.get_height());
  34. printf(" window2.get_width() = %d /n/n", window2.get_width());
  35. //window2.printSize(); //compile error:passing `const Widget' as `this' argument of `void Widget::printSize()' discards qualifiers
  36. while(1);
  37. return 0;
  38. }
  39. //result:
  40. /*
  41. window.get_height() = 128
  42. window.get_width() = 240
  43. printSize: height = 128
  44. printSize: height = 240
  45. window2.get_height() = 116
  46. window2.get_width() = 116
  47. */

代码说明:

compile error:passing `const Widget’ as `this’ argument of `void Widget::printSize()’ discards qualifiers:

编译错误,因为widget2是const数据成员,那么,它只能访问const成员函数,而不能访问非const成员函数。

  1. 有用链接:

以上描述了const数据成员在类中的定义及其访问规则,而其它更加详细的用法,请参考以下文章:

http://blog.chinaunix.net/u3/96369/showart_2054536.html

http://www.yuanma.org/data/2007/0429/article_2549.htm

发表评论

表情:
评论列表 (有 0 条评论,39人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++中const用法总结

    1. const常量,如const int max = 100; 优点:const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符

    相关 C/C++中const用法小结

    常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。因此,定义或说明常类型时必须进行初始化。 概述 1. const有什么用途? 在