《C++面向对象高效编程(第2版)》——3.7 编译器如何实现const 成员函数-阿里云开发者社区

开发者社区> 异步社区> 正文

《C++面向对象高效编程(第2版)》——3.7 编译器如何实现const 成员函数

简介:
+关注继续查看

本节书摘来自异步社区出版社《C++面向对象高效编程(第2版)》一书中的第3章,第3.7节,作者: 【美】Kayshav Dattatri,更多章节内容可以访问云栖社区“异步社区”公众号查看。

3.7 编译器如何实现const 成员函数

C++面向对象高效编程(第2版)
了解编译器如何强制执行逐位常量性(bitwise constantness)非常有趣。记住,成员函数没什么特别,它只是一个带有奇怪名称和this指针的函数。那么,编译器如何能检测到成员的赋值?

这非常简单。数据成员和函数之间唯一的连接就是this指针。const成员函数必须把调用它的对象当做const对象,这可以通过将this指针声明为指向const的指针轻松地做到,很简单。现在来看看带有显式声明this指针的HowMany原型:
`
unsigned HowMany(const TIntStack* this);`
根据这个声明,任何通过指针给对象内部的数据成员赋值都是非法的,因为该this指针是一个指向常量的指针。

在同一个类中,可以包含两个相同的函数,一个是const函数,另一个是非const函数。这完全可行,而且在某些环境中非常有用。

注意:
const成员函数不能在它的实现中调用另一个非const成员函数。因为相同的对象(相同的this指针)也可以调用非const成员函数,而此非const成员函数可以随意修改对象。这违反了调用const成员函数的常量性(constantness),编译器将会检测出来。
Eiffel:

Eiffel支持与const成员函数非常类似的概念。Eiffel有两种类型的成员函数:过程(procedure)和函数。过程与普通的成员函数类似,但它们无返回值。函数是一个操作,根据对象中包含的值进行计算,并返回计算的值,这样的函数不会改变对象的状态。因此,过程和函数都与const成员函数类似。Smalltalk并没有类似的概念。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
再谈类成员虚函数
以前经常学习虑函数 最多的是当基类指针构造子类对象时,调用函数的应用,但是以前没这一点: 子类对象调用基类成员函数A,然后基类成员函数又会调用一个类成员函数B,这个类成员函数B在子类中也定义,基类中也定义(基类和子类同时拥有)。
732 0
用xcode和excel整理类的成员函数和成员变量
这个是以前情况才实用: 1. 没有debug symbol的类 2. 类被很多宏隔开了,都说不清楚那些宏的启用的 3. Category和Extension隔开了 整理函数: 1. 把程序运行起来,点击调试工具的暂停。
668 0
《JavaScript启示录》——1.2 JavaScript构造函数构建并返回对象实例
如果说“构造函数只是一个函数”,那么我会说“你是对的,除非使用new关键字来调用该函数。”(如new String('foo'))。如果使用new调用某函数,该函数则担任一个特殊的角色,JavaScript给予该函数特殊待遇,将该函数的this值设置为正在构建的新对象。
1350 0
C++函数对象
  原文:http://blog.csdn.net/ggggqqqqihc/article/details/1727020   标准库里的count_if可以统计容器中满足特定条件的元素的个数。例如要统计一个整数vector——ivec中正数的个数,可以先写一个返回类型为bool,含有一个int参数的条件函数: bool pred(int val){ return val>0; }    之后可以用count_if(ivec.begin(),ivec.end(),pred)计算出正整数的个数。
482 0
对象,函数作为一个函数的参数
1 2 3 4 5 对象,函数作为一个函数的参数 6 7 8 9 //1.将一个对象传给一个函数 10 function $$(id){ 11 return document.
615 0
【IOS 开发】Object - C 面向对象 - 类 , 对象 , 成员变量 , 成员方法(二)
【IOS 开发】Object - C 面向对象 - 类 , 对象 , 成员变量 , 成员方法(二)
3 0
JavaScript创建对象(二)——构造函数模式
在JavaScript创建对象(一)—— 工厂模式中留下了一个问题,就是创建一个对象怎么判断一个对象的类型。换句话说使用下面这种方式: function createPerson(name, age, job){ var o = new Object(); o.
832 0
+关注
异步社区
异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
12049
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载