class 中带有 const getter 的 c++ 成员初始值设定项

c++ member initializer with const getter in a class

您好,我在尝试 运行 以下内容时遇到内存访问冲突的 运行 时间错误:

class MyMutable{
private :
    std::string m_name;
    mutable int m_DebugCount;
public:
    MyMutable()
        : m_name(" "), m_DebugCount(0) {}

    MyMutable(std::string& newName)
        : m_name(newName), m_DebugCount(0) {}

    std::string getName() const
    {
        ++m_DebugCount;
        return m_name;
    }
};

int main()
{
    const MyMutable k((std::string&)("Hello"));
    std::cout << k.getName() << std::endl;
}

我得到的错误在下面,我在 m_debugcount:

之后的第二个构造函数中得到它

在 ConsoleApplication1.exe 中的 0x7C1436C0 (vcruntime140d.dll) 抛出异常:0xC0000005:访问冲突读取位置 0x011FDFA0。发生

您应该避免 c-style 转换并使用 static_cast 因为它更安全。更改您的代码以使用 static_cast:

const MyMutable k(static_cast<std::string&>("Hello"));

错误结果:

error: non-const lvalue reference to type 'std::string' (aka 'basic_string<char>') cannot bind to a value of unrelated type 'const char [6]'
    const MyMutable k(static_cast<std::string&>("Hello"));

解决方案是更改您的构造函数以采用 const 引用,然后您根本不需要转换,因为字符串文字会自动转换为 std::string:

#include <string>
#include <iostream>

class MyMutable{
private :
    std::string m_name;
    mutable int m_DebugCount;
public:
    MyMutable()
        : m_name(" "), m_DebugCount(0) {}

    MyMutable(const std::string& newName)
        : m_name(newName), m_DebugCount(0) {}

    std::string getName() const
    {
        ++m_DebugCount;
        return m_name;
    }
};

int main()
{
    const MyMutable k("Hello");
    std::cout << k.getName() << std::endl;
}