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类型,则试图修改该变量的值的操作都被视编 ...
随机推荐
- PopupWindow+ListView
1. 获取打到数据 for (int i = 0; i < iocOutMakeMaterialSubmit.data.size(); i++) { dataListPopupWindow.ad ...
- Android Terminal telnet windows
/******************************************************************************************** * Andr ...
- UVA 10061 How many zero's and how many digits ? (m进制,阶乘位数,阶乘后缀0)
题意: 给出两个数字a和b,求a的阶乘转换成b进制后,输出 (1)后缀中有多少个连续的0? (2)数a的b进制表示法中有多少位? 思路:逐个问题解决. 设a!=k. k暂时不用直接转成b进制. (1 ...
- Python [Leetcode 350]Intersection of Two Arrays II
题目描述: Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, ...
- centos安装新版的nginx与php,添加memcahced扩展,测试memcached的json序列化
nginx安装前置是pcre库,memcahced前置是libmemcached库,需要通过编译参数指定地址. memcached需要通过编译参数开启json,sasl,igbanry,安装过的需要删 ...
- 一天一点MySQL复习——存储过程
一.存储过程概念 使用SQL编写访问数据库的代码时,可用两种方法存储和执行这些代码,一种是在客户端存储代码,并创建向数据库服务器发送的SQL命令(或SQL语句),比如在C#.Java等客户端编程语言中 ...
- Hadoop 学习总结之一:HDFS简介
一.HDFS的基本概念 1.1.数据块(block) HDFS(Hadoop Distributed File System)默认的最基本的存储单位是64M的数据块. 和普通文件系统相同的是,HDFS ...
- Eclipse c++环境搭建 并加载OpenCV库 2015最新
C++: 搜索 Eclipse c++ 即可 注意新版的mingw安装器,要安装: 1.mingw-developer-toolkit 2.mingw32-base 3.mingw32-gcc-g++ ...
- java 调用 .net webservice
1.首先下载Axis2工具包 2.解压之后用cmd命令进入bin目录WSDL2Java.bat -uri http://192.168.20.42:9999/LoginService.asmx?wsd ...
- 嵌入式 arm平台ping域名指定ip小结
在fs的目录/etc/下添加文件hosts,然后内容修改如下: 192.168.11.12 qycam.com ping qycam.com 解析为192.168.11.12