c++ - 使用 const_cast 在类中分配非静态 const 成员
问题描述
为什么可以使用 const_cast 分配非静态 const 成员,这在什么时候有用?
在下面的代码中,A 和 B 类都可以编译并正常工作。但是,对于 B,它的 const 成员 s 不是使用构造函数中的初始化器列表来初始化的,而是通过使用 const_cast 删除 const 并通过引用传递给它的值。也可以写成(string&)s = _s;
我不经常在作业的左侧看到 const_cast ,但这似乎工作正常。B的构造函数的优缺点是什么?
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
class A {
public:
A(const string& _s) : s(_s) {}
void display() {cout << s << endl;}
private:
const string s;
};
class B {
public:
B(const string& _s) {
const_cast<string&>(s) = _s;
}
void display() {cout << s << endl;}
private:
const string s;
};
int main() {
A a("abc");
a.display();
B b("def");
b.display();
return EXIT_SUCCESS;
}
输出:
abc
def
解决方案
为什么可以使用 const_cast 分配非静态 const 成员,这在什么时候有用?
取决于您所说的“可以”。
该程序格式正确,因为您修改了非常量左值。
程序的行为是未定义的,因为您修改了一个 const 对象。
这什么时候有用?
修改 const 对象永远不会有用。
从引用中去掉 const 有时虽然很少,但很有用,这就是 const_cast 存在的原因。但它仅在您有对非 const 对象的 const 引用时才有用。
B的构造函数的优点是什么?
没有任何。
B的构造函数的...缺点是什么?
如果调用 B 的构造函数,则程序的行为是未定义的。
推荐阅读
- azure - 部署 Web 应用程序时 Microsoft Azure 中可能存在的错误?
- r - 如何使用 r 函数 wtable 在加权表中显示零?
- c++ - c++ 如何读取结构化数据并跳过表头的第一行?
- go - 使用`go build`时如何解决“包不在GOROOT”?
- ios - 将 .p8 转换为 .p12 证书以用于 iOS 推送通知
- split - ANSIBLE:拆分函数未从字符串中删除“\r”回车符
- javascript - $('selector').editableSelect() 正确获取值 editableSelect
- python - 未找到关键字参数“{'pk': 11}”的“detail_view”反向 - (使用 Slug 字段)
- javascript - Javascript - 使用包含 $ 和其他特殊字符的字符串替换()
- python - 使用 colorgram 从图像中提取所有颜色