const型类成员
一、关于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
- #include<iostream>
- using namespace std;
- class A
- {
- public: //explicit A(int);
//error: 不能将参数 1 从“int”转换为“const A”,对象不能自动将const转换非const,但能将非const转换为
const的,没有问题,所以问题的实质是不能将参数 1 从“int”转换为“const A”,因为explicit使构造函数产生的隐式转换不能发
生。- A(int);
- //A() const;-->error:“const”“this”指针对于构造函数/析构函数是非法的
- int getNum () const;//const在函数声明和定义中都要有
- private:
- int num;
- };
- A::A(int a)
- {
- num=a;
- }
- int A::getNum () const//注意这里,这么设计当然是有原因的,因为基于const是可以函数重载的,const是签名的一部分,如果这里不写const,那么编译器会提示找不到重载的成员函数
- {
- return num;
- }
- int Test(const A a)
- {
- return a.getNum();//const 对象调用内部的函数必须是const的,不管是不是真的会修改成员变量,
- }
- int main()
- {
- cout<<Test(2);
- int i;
- cin>>i;
- return 0;
- }
二、关于const类数据成员有以下几个需要注意的地方:
1. const static int 可以使static数据成员在类定义体内初始化;
2. 可以通过将数据成员声明为mutable来实现对该类const对象的该数据成员的更改;
3. 初始化const数据成员的唯一机会实在构造函数的初始化列表中,直接在类的定义体中以及在构造函数的定义体中初始化都是不正确的。
const型类成员的更多相关文章
- 类中用const限定的成员函数
本文转自http://blog.csdn.net/whyglinux/article/details/602329 类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非 ...
- 用 const 限定类的成员函数
类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变. 在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于 ...
- [转载]能不能同时用static和const修饰类的成员函数?
题目(一):我们可以用static修饰一个类的成员函数,也可以用const修饰类的成员函数(写在函数的最后表示不能修改成员变量,不是指写在前面表示返回值为常量).请问:能不能同时用static和con ...
- static 类成员变量 和 static const类成员变量
1.使用static类的优点: (1)避免与其他类的成员或者全局变量冲突 (2)可以封装 (3)阅读性好 2.static 数据成员独立于该类的任意对象而存在 static数据成员的类型可以是该成员所 ...
- 【转】C++的const类成员函数
我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误.例如, const char blank=' '; blank='\n'; //错误 面向对象程序设计中 ...
- c++类成员函数后边加const是为什么?
时间是让人猝不及防的东西,晴是有风阴时有雨,争不过朝夕,又念着往昔,偷走了青丝却留住一个你 #include <iostream> #include <string> usin ...
- [UE4]C++的const类成员函数
我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误.例如: const char blank = ‘’; blank = ‘\n’; // 错误 要声明一个 ...
- const修饰的成员是类成员,还是实例成员?
很抱歉,我以为只有static修饰的成员是类成员,可以通过类名直接访问,然而,const 修饰的成员也属于类成员,直接通过类名访问,不能通过实例变量访问. 做维护久了,深刻的理解,扎实的基础对写出高质 ...
- C++的const类成员函数
转自:http://blog.csdn.net/lihao21/article/details/8634876 我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编 ...
随机推荐
- ajax连接数据库并操作数据库
Response.Write("<script type='text/javascript' language='javascript' >alert('用户名不能为空!请输入 ...
- 【英语】Bingo口语笔记(4) - Pick系列
take your pick. 你挑吧 pick on 找茬
- 部署K2 Blackpearl流程时出错(与基础事务管理器的通信失败或Communication with the underlying transaction manager has failed.
转:http://www.cnblogs.com/dannyli/archive/2011/12/01/2270222.html 亲,在部署K2流程是,是否遇到这个错误(以下是中.英文错误信息) 中文 ...
- 支持多种浏览器的纯css下拉菜单
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- DevExpress控件GridView挂下拉控件无法对上值
下拉控件使用RepositoryItemLookUpEdit,加入如下事件进行处理. repositoryItemLookUpEdit1.CustomDisplayText += new DevExp ...
- objective-C 中两种实现动画的方法
第一种方法: [UIView beginAnimations:@"Curl"context:nil];//动画开始 [UIView setAnimationDuration:1.2 ...
- Oracle 安装 检查操作系统版本 必须是 5.0 5.1 的解决办法
打开 oraparam.ini文件 添加红色部分 Windows=5.1,5.2,6.1 最下面添加 [Windows-6.1-required]#Minimum display colours fo ...
- 关于TCP/UDP缓存
1.修订单个socket的缓冲区大小:通过setsockopt使用SO_RCVBUF来设置接收缓冲区,该参数在设置的时候不会与rmem_max进行对比校验,但是如果设置的大小超过rmem_max的话, ...
- [转]linux系统磁盘分区之parted
转自:http://blog.csdn.net/h249059945/article/details/12668793 对于linux的分区通常可以使用fdisk命令工具和parted工具对于分区表通 ...
- 在Jenkins中使用Git Plugin访问Https代码库失败的问题
最近需要在Jenkins上配置一个Job,SCM源是http://git.opendaylight.org/gerrit/p/integration.git 于是使用Jenkins的Git Plugi ...