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

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

相关文章
|
2天前
|
编译器 C++
【c++】取地址及const取地址操作符重载
【c++】取地址及const取地址操作符重载
【c++】取地址及const取地址操作符重载
|
2天前
|
C语言 C++
【c++】什么是面向对象
【c++】什么是面向对象
【c++】什么是面向对象
|
7天前
|
编译器 C语言 C++
【C++基础】 --- C++ const
【C++基础】 --- C++ const
11 2
|
7天前
|
编译器 C语言 C++
【C++基础 】 --- C++ 为什么需要定义成员函数
【C++基础 】 --- C++ 为什么需要定义成员函数
9 0
|
8天前
|
编译器 C++
C++:类的默认成员函数
C++:类的默认成员函数
27 0
|
11天前
|
存储 数据安全/隐私保护 C++
基于C++的面向对象程序设计:类与对象的深入剖析
基于C++的面向对象程序设计:类与对象的深入剖析
22 1
|
11天前
|
安全 编译器 C语言
深入了解C++:形参、内联、重载、引用、const和指针、new和delete
深入了解C++:形参、内联、重载、引用、const和指针、new和delete
17 1
|
23天前
|
C++
C++引用与const
C++引用与const
|
2天前
|
C++
【c++】模板---类模板
【c++】模板---类模板
|
2天前
|
Java C++ Python
【c++】理解类和对象
【c++】理解类和对象
【c++】理解类和对象

热门文章

最新文章

相关产品

  • 云迁移中心