《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并没有类似的概念。

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

相关文章
|
5天前
|
C++
面向对象的C++题目以及解法2
面向对象的C++题目以及解法2
11 1
|
7天前
|
存储 编译器 C++
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
|
13天前
|
编译器 C++
|
15天前
|
存储 人工智能 机器人
【C++面向对象】C++图书管理系统 (源码)【独一无二】
【C++面向对象】C++图书管理系统 (源码)【独一无二】
|
20天前
|
存储 人工智能 BI
【C++面向对象】C++银行卡管理系统(源码+论文)【独一无二】
【C++面向对象】C++银行卡管理系统(源码+论文)【独一无二】
|
26天前
|
编译器 C语言 C++
【C++练级之路】【Lv.3】类和对象(中)(没掌握类的6个默认成员函数,那你根本就没学过C++!)
【C++练级之路】【Lv.3】类和对象(中)(没掌握类的6个默认成员函数,那你根本就没学过C++!)
|
27天前
|
设计模式 安全 C++
【C++ const 函数 的使用】C++ 中 const 成员函数与线程安全性:原理、案例与最佳实践
【C++ const 函数 的使用】C++ 中 const 成员函数与线程安全性:原理、案例与最佳实践
70 2
|
23小时前
|
C++
c++的学习之路:7、类和对象(3)
c++的学习之路:7、类和对象(3)
8 0
|
1天前
|
存储 编译器 C语言
c++的学习之路:5、类和对象(1)
c++的学习之路:5、类和对象(1)
8 0
|
3天前
|
存储 安全 C语言
【C++】string类
【C++】string类

热门文章

最新文章