关于C++编程语言的问题
Question About The C++ Programming Language
在《C++编程语言》一书的第24.3.4章中说:
class Cfield : public Field{ /*...*/ }
这表达了一个概念,即
Cfield
真的是一种场, 允许在以下情况下使用符号方便 编写Cfield
使用 现场部分的成员Cfield
,最重要的是 - 允许Cfield
覆盖字段 虚拟功能。障碍在于Cfield*
到Field*
转换Cfield
声明中隐含 挫败所有控制访问的尝试 到Field
:void g(Cfield* p) { *p = "asdf"; // access to Field controlled by Cfield's assignment operator: // p->Cfield::operator=("asdf") Field* q = p; // implicit Cfield* to Field* conversion *q = "asdf" // OOPS! no control }
我在这里不明白的是粗体句子。Cfield
是如何挫败控制Field
访问的尝试的?
实际上,代码的最后一行:
*q = "asdf";
会打电话给Field::operator=("asdf")
,那么Cfield
是如何挫败控制对Field
的访问的尝试的呢?
>CField
实例应该提供对Field
基类数据的受控(即通过CField::operator=()
以某种方式检查(访问。但是,如果您隐式地将CField *
投射到Field *
,然后取消引用它,则该控件将消失,因为您拾取了Field::operator=()
。
我同意这不是 BS 最清晰的著作,在我看来有点无关紧要——如果你下定决心,你总是可以"不受控制地访问"任何东西。
我想它指的是Cfield
的赋值运算符可能会做保持对象状态一致所需的特殊操作的问题。通过使用超类的赋值运算符,可能会破坏不变量。
让我们举一个具体的例子:
struct Field {
Field(char const* s): string(s) {}
char const* string;
};
struct CField: Field {
CField(char const* s): Field(s), length(s ? ::strlen(s) : 0) {}
std::size_t length;
};
这是一种非常基本的字符串,也不允许修改它引用的字符串。 CField
通过缓存字符串的长度来扩充Field
类。
现在,在行动中:
void foo(CField& cf) { // 0
cf = "foo"; // 1
Field& f = cf; // 2
f = "foobar"; // 3
}
会发生什么?
- 第 0 行:状态未知
- 第 1 行:调用
CField& CField::operator=(CField const&)
,这将创建一个临时CField
(使用构造函数(,cf.string
"foo"
,cf.length
3
- 第 2 行:同一对象,可通过
Field
直接访问 - 第 3 行:调用
Field& Field::operator=(Field const&)
,这将创建一个临时Field
(使用构造函数(,cf.string
"foobar"
cf.length
3
(未更改(
如您所注意的,由于通过 Field&
对string
进行不受保护的访问,length
缓存string
长度的不变性被破坏。
相关文章:
- 了解算法的性能差异(如果以不同的编程语言实现)
- 为什么编程语言被编译为汇编程序而不是二进制?
- 返回不停止函数,递归函数问题?(编程练习,动态规划,Levenshtein 回溯)
- 如何在同时包含C++和Python的项目(多编程语言项目)中使用doxygen
- 什么是编程语言支持定义您自己的自定义运算符?
- 如何通过不同的编程语言发送,接收和解析XML消息
- 今天的主流编程语言主要使用动态还是静态(词汇)作用域?
- 谁以编程语言(例如C )制定标准
- 如何使用任何编程语言组合序列中的多个图像
- 我可以使用功能指针在编程语言边界上调用函数
- 有没有办法将cin.fail和cin.clear翻译成C编程语言
- 编程语言中的 char-int 等价性
- 代码块上的编译器标志出现问题.编程初学者
- C 编程语言帮助我
- 从其他编程语言调用 c++ dll 类函数
- 值和对象不同的编程语言
- 返回 2 语句的含义 c++ 编程语言
- 互联网连接速度与HTTP请求的编程语言速度
- 在什么编程语言游戏引擎上编写"Frostbit 3"?
- 关于C++编程语言的问题