C++ this指针和const成员函数
this指针
- this指针:成员函数通过一个名为this的隐式形参来访问调用它的那个对象。this由调用该成员函数的对象的地址初始化。
1 Sales_data total; 2 total.isbn(); //等价于Sales_data::isbn(&total),编译器负责把total的地址传递给isbn的隐式形参this
this是一个常量指针,因为this总是指向“这个”对象,不允许改变this中保存的地址。
const成员函数:
- 来源:默认情况下,this是指向类类型非常量版本的常量指针,尽管this是隐式形参,但也需要遵循初始化准则,在默认情况下不能把this绑定到一个常量对象上(普通指针不能指向常量),即我们不能在一个常量对象上调用普通的成员函数。因此,设计类的一个准则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函数不能加 const。
(1)有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员;没有 const 修饰的成员函数,对数据成员则是可读可写的。
(2)除此之外,在类的成员函数后面加 const 还有什么好处呢?那就是常量(即 const)对象可以调用 const 成员函数,而不能调用非const修饰的函数。 - 在C++中,只有被声明为const的成员函数才能被一个const类对象调用。
- const成员函数可以访问非const对象的非const数据成员,const数据成员,也可以访问const对象内的所有数据成员。
- 非const成员函数只可以访问非const对象的任意的数据成员(不能访问const对象的任意数据成员)。
- 作为一种良好的编程风格,在声明一个成员函数时,若该成员函数并不对数据成员进行修改操作,应尽可能将该成员函数声明为const 成员函数。
- const成员函数可以被对应的具有相同形参列表的非const函数重载:如果只有const成员函数,非const对象是可以调用const成员函数的。当const版本和非const版本的成员函数同时出现时,非const对象调用非const成员函数。
#include<iostream> using namespace std;class A { public:void f(){cout << "not const" << endl;}void f() const{cout << "const" << endl;} };int main() {A a; cout << "a: ";a.f();const A &b = a;cout << "b: ";b.f();const A *c = &a;cout << "c: ";c->f();A *const d = &a;cout << "d: ";d->f();A *const e = d;cout << "e: ";e->f();const A *f = c;cout << "f: ";f->f();return 0; } //output:
a: not const
b: const
c: const
d: not const
e: not const
f: const
转载于:https://www.cnblogs.com/betaa/p/10577960.html
C++ this指针和const成员函数相关推荐
- C++知识点11——this指针,const成员函数,访问权限控制
1.this指针 每个类都有this指针,this指针指向this指针指向的是类的对象本身 class A { public:A() {}~A() {}void func() {cout<< ...
- C++中的const成员函数介绍
List { 02 private: 03 Node * p_head; 04 int length; 05 -- 06 Public: 07 int Get ...
- C++中的const成员函数
文章目录 1 C++中的const成员函数 1.1 const成员函数的使用 1.2 同名的const成员函数和非const成员函数构成重载关系 2 mutable关键字 1 C++中的const成员 ...
- const成员函数、const类对象、mutable数据成员
1. const成员函数 只是告诉编译器,表明不修改类对象. 但是并不能阻止程序员可能做到的所有修改动作,比如对指针的修改,编译器可能无法检测到 2. 类体外定义的const成员函数,在定义和声明处都 ...
- C++之const类成员变量,const成员函数
const修饰类的成员函数 const修饰变量一般有两种方式:const T *a,或者 T const *a,这两者都是一样的,主要看const位于*的左边还是右边,这里不再赘述,主要来看一下当co ...
- 【C++】类和对象【中篇】--C++六个默认成员函数以及const成员函数
文章目录 一.类的6个默认成员函数 二.构造函数 1.概念 2.特性 2.1特征分析--自动生成 2.2.特征分析--选择处理 2.3特征分析--默认构造 3.C++11补丁--缺省值 三.析构函数 ...
- 成员函数对象类的const和非const成员函数的重载
首先声明,我是一个菜鸟.一下文章中出现技术误导情况盖不负责 1. 类的const成员函数与非const成员函数的载重 #include <iostream> #include <st ...
- 类与对象:类的6个默认成员函数: 构造函数、析构函数、拷贝构造函数、赋值操作符重载、默认拷贝构造与赋值运算符重载的问题、const成员函数、 取地址及const取地址操作符重载
1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类.任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数. 构造函数 析构函数 拷贝构造函数 赋值操作符重载 const成员函数 ...
- const对象不能调用非const成员函数
在C++中,可以用const来定义一个const对象,但const对象不可以调用类中的非const成员函数 原因 引发原因:: 由调用成员函数时隐式传入的当前对象的this指针引起. 非const成员 ...
最新文章
- POJ 1160 Post Office
- word怎么设置图片编号(图片下标,图片标签,图片序号,图片注释,题注)(交叉引用)
- synchronized使用和原理全解
- 让Visual Studio 也支持JS代码折叠 —— 续 [ Visual Studio | Js | ScriptOutline | SmallOutline ]...
- Android进度条函数,Android实用笔记——使用ProgressBar实现进度条
- odbc删除oracle驱动,恢复ODBC驱动程序(ODBC driver)
- html打开ppt自动播放,PPT怎么自动播放
- ATMEGA128芯片标识
- 2015年全国大学生电子设计大赛综合测评题
- authorization cache cannot be obtained
- 四、SQL函数②(字符串函数)
- CapsuleNet的一个小例子
- Sphinx全文索引搜索常见的一些错误处理收集
- 软考-嵌入式系统设计师:[知识产权与标准化:笔记(七)]
- word 全部更新域
- 【图像加密】 Logistic混沌+Arnold置乱图像加密解密【含Matlab源码 1281期】
- win7系统安装信息服务器不可用怎么办,win7系统rpc服务器不可用怎么办
- 注会 第三章 存货
- java,定义类(手机),调用(手机的各种方法)演示
- 第三章 线性系统的时域分析