再议C/C++中const的用法

关于C/C++const的用法,我们之前也介绍过很多,大家可以看看这两篇文章,《C++基础 详细介绍const的用法》和《C++初学者 const使用详解》,供参考。

10年积累的成都做网站、成都网站设计、成都外贸网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有阿巴嘎免费网站建设让你可以放心的选择与我们合作。

今天在学习到《Essential C++》第4.1节时又有了“稍进一步”的发现,即当const来修饰一个类的成员函数时,它并不仅仅是禁止修改类里面的数据,而且要求其里面用到的类的成员都是具有const属性的。如下以为示例:

 
 
 
  1. // CONST.CPP
  2. #include 
  3. using namespace std;
  4. class MyClass
  5. {
  6. public:
  7. MyClass();
  8. int getValueA();
  9. int getValueB()const;
  10. private:
  11. int a;
  12. int b;
  13. };
  14. MyClass::MyClass()
  15. {
  16. a = 1;
  17. b = 2;
  18. }
  19. inline int MyClass::getValueA()
  20. {
  21. return a;
  22. }
  23. inline int MyClass::getValueB()const
  24. {
  25. cout <<"value a: " <
  26. return b;
  27. }
  28. int main()
  29. {
  30. MyClass myclass;
  31. cout <
  32. cout <<"value a: " <
  33. return 0;

在上面的代码中,MyClass中以const修饰的成员函数getValueB()中调用了非const成员函数getValueA(),这段代码在编译是会提示有误:

IDE: VS 2008

 
 
 
  1. const.cpp
  2. D:/Program Files/Microsoft Visual Studio 9.0/VC/include/xlocale(342) : warning C
  3. 4530: 使用了 C++ 异常处理程序,但未启用展开语义。请指定 /EHsc
  4. const.cpp(29) : error C2662: “MyClass::getValueA”: 不能将“this”指针从“const
  5. MyClass”转换为“MyClass &”
  6. 转换丢失限定符 

IDE: CODEBLOCKS

 
 
 
  1. F:/Programs/CodeBlocks/C++/Const/const.cpp||In member function 'int MyClass::getValueB() const':|
  2. F:/Programs/CodeBlocks/C++/Const/const.cpp|29|error:
  3. passing 'const MyClass' as 'this' argument of 'int MyClass::getValueA()' discards qualifiers|
  4. ||=== Build finished: 1 errors, 0 warnings ===| 

如上错误可以在将getValueA()添加const修饰后得到更正。

附:

自己说的这些可能早就已经在某些书上指出,不过自己没有碰到,既然刚刚学到,就记下来以备忘。另外下面再总结下const的其他点点。

1. const修饰常量、引用等时

“只读”属性。

2. 限定符const与指针时

有两种用法,一为指向const对象的指针,二为const指针。

3. const可以提高编译效率

编译器在编译期间通常不为const常量分配内存空间,而是把它保存在符号表(这个名词在《程序员的自我修养》里有很清楚的解释,空时再看)。少了存储与读内存的操作。

注意:

1、在使用指向const对象指针A的时候,虽然不能够通过这个指针去修改其所指向的对象,但是并不表示每个被这种指针所指向的对象就一定受到良好的“保护”,因为这个对象本身就有可能已经被“偷梁换柱”。原因在于“非const对象的地址是允许赋给const对象的指针的”。

2、const限定符既可以放在类型前也可以放在类型后,在运用typedef写const类型定义时容易犯错。所以较好的写法为把const放在类型的后面。

现在想想这是顺其自然的事,因为只有在保证const成员函数里面调用的成员函数不修改对象的情况下,才能够保证这个const成员函数也不改变对象。所以被调用的成员函数被声明为const是很保险的做法。

名称栏目:再议C/C++中const的用法
网页路径:http://www.shufengxianlan.com/qtweb/news41/215741.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联