首页 > 解决方案 > 使用 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

标签: c++constructorconstantsconst-cast

解决方案


为什么可以使用 const_cast 分配非静态 const 成员,这在什么时候有用?

取决于您所说的“可以”。

该程序格式正确,因为您修改了非常量左值。

程序的行为是未定义的,因为您修改了一个 const 对象。

这什么时候有用?

修改 const 对象永远不会有用。

从引用中去掉 const 有时虽然很少,但很有用,这就是 const_cast 存在的原因。但它仅在您有对非 const 对象的 const 引用时才有用。

B的构造函数的优点是什么?

没有任何。

B的构造函数的...缺点是什么?

如果调用 B 的构造函数,则程序的行为是未定义的。


推荐阅读