一、关于const类成员函数有以下几个需要注意的地方:

1. 在普通的非const成员函数中,this的类型是一个指向类类型的const指针,而const成员函数中,this的类型是一个指向const类类型对象的const指针。由于这个原因:

(1) 返回值 函数名 (参数列表) const {…} 这种格式只能用在类的成员函数中,非成员函数只能使用这种形式:void f1(const std::string& s);
(2) 如要返回该类对象的引用(*this),则在返回值声明前加上const(指向const对象的指针或引用一定要为const型的)。

2. 基于成员函数是否是const,可以进行重载,这里又有以下要注意:

(1) const成员函数中的const标签必须在函数声明和定义中都要指出;
(2) const对象只能使用const成员函数,非const对象可以使用任一成员。

3. 构造函数不可声明为const

  1. #include<iostream>
  2. using namespace std;
  3. class   A
  4. {
  5. public:       //explicit A(int);
    //error: 不能将参数 1 从“int”转换为“const A”,对象不能自动将const转换非const,但能将非const转换为
    const的,没有问题,所以问题的实质是不能将参数 1 从“int”转换为“const A”,因为explicit使构造函数产生的隐式转换不能发
    生。
  6. A(int);
  7. //A() const;-->error:“const”“this”指针对于构造函数/析构函数是非法的
  8. int getNum () const;//const在函数声明和定义中都要有
  9. private:
  10. int   num;
  11. };
  12. A::A(int a)
  13. {
  14. num=a;
  15. }
  16. int A::getNum () const//注意这里,这么设计当然是有原因的,因为基于const是可以函数重载的,const是签名的一部分,如果这里不写const,那么编译器会提示找不到重载的成员函数
  17. {
  18. return num;
  19. }
  20. int Test(const A a)
  21. {
  22. return a.getNum();//const 对象调用内部的函数必须是const的,不管是不是真的会修改成员变量,
  23. }
  24. int main()
  25. {
  26. cout<<Test(2);
  27. int i;
  28. cin>>i;
  29. return 0;
  30. }

二、关于const类数据成员有以下几个需要注意的地方:

1. const static int 可以使static数据成员在类定义体内初始化;
2. 可以通过将数据成员声明为mutable来实现对该类const对象的该数据成员的更改;
3. 初始化const数据成员的唯一机会实在构造函数的初始化列表中,直接在类的定义体中以及在构造函数的定义体中初始化都是不正确的。

最新文章

  1. QL Server 2008 所有账号丢失sysadmin权限,sa账号亦没有开启,该如何解决??
  2. JHChart iOS图表工具库1.0.3新版本详解
  3. [Node.js] Promise,Q及Async
  4. JVM的数据类型
  5. 循环repeater中的每一列,并计算数据和
  6. [JavaScript] JS中对Base64的解析
  7. SqlBulkCopy 简单运用
  8. win下Java环境安装
  9. 将Excel,ppt和word转化为html
  10. JS(三)
  11. MYSQLI - mysqli
  12. Python之列表生成式、生成器、可迭代对象与迭代器
  13. MyBatis延迟加载和缓存
  14. latex beamer 添加页码
  15. highcharts的用法
  16. 让Elasticsearch集群冷热分离、读写分离【转】
  17. day13: 迭代器和生成器
  18. php的isset()和empty()区别
  19. 优化方法:SGD,Momentum,AdaGrad,RMSProp,Adam
  20. Xcode升级到9.3之后pod问题

热门文章

  1. .net4.0下 解决asp.net中&ldquo;从客户端中检测到有潜在危险的Request.Form值&rdquo;的错误
  2. *ecshop安装模板
  3. 【英语】Bingo口语笔记(56) - “令人失望”的表达
  4. 项目中使用的ajax异步读取数据结构设计
  5. SqlDataAdapter的update方法
  6. 【转】Linux设备驱动之I/O端口与I/O内存
  7. hdu 2167(状态压缩基础题)
  8. 用标准C编写COM(一)
  9. Sunday算法(字符串查找、匹配)
  10. Oracle 热备份batch脚本 Windows