0

我写了一个小问题来检查 const 数据成员上 const_cast 的行为。

using namespace std;


     class myString{
         public:
                 myString(char * str)
                 {
                         p=str;
                 }
                 const char * getString(){
                         return p;
                 }
         private:
                 const char *p;
 } ;


int main()
{
        char *p=(char*)malloc(8);
        cin>>p;
        myString *m= new myString(p);
        char *s =const_cast<char*>(m->getString());
        s[6]='y';
        cout<<s<<endl;
        return 0;
}

运行此程序后,我将输出作为“yogendra”(一个 8 个字母的字符串)。我得到的输出是“yogendya”现在我的怀疑。通过 const_cast<> 我们可以覆盖数据成员本身的行为,因为这里的字符串是 const char* 在转换之后我仍然可以修改它。

4

3 回答 3

5

你已经准确地描述了const_cast它的用途——它允许你const从某些东西中移除并修改它。由你决定不要滥用这种权力。:-)

(在您的情况下,这不适用,但请注意,您可能会通过使用导致崩溃const_cast- 例如:

const char *c = "Hello";
char *s = const_cast<char*>(c);
s[0] = 'h';

可能会崩溃,因为编译器可以将字符串文字放入只读内存。)

于 2013-03-26T11:46:03.083 回答
1

是的,您可以使用const_cast<>这种方式,它不会是未定义的行为,因为const char*您的类中指向的对象确实是非 const 类型char*。但小心点:。C++ 标准。§7.1.​5.1/4 说

除了可以修改任何声明为 mutable (7.1.1) 的类成员外,任何在 const 对象的生命周期 (3.8) 期间修改它的尝试都会导致未定义的行为

const_cast 的安全使用是将 const 从 const 引用转换为非 const 对象:当有非 const 对象并且您有 const ref 时,您可以安全地从 this 中转换 const

于 2013-03-26T11:50:45.987 回答
0

如果你说

char *s =const_cast<char*>(m->getString());

然后你基本上从指针中删除“const”,并声明你s是一个指向char的指针,它是一个可写的字符串。所以下一行

s[6]='y';

很好。要保留 const,您应该声明s为 const 指针

const char *s = m->getString();

在这种情况下,您将无法覆盖常量字符串(错误:分配只读位置)。我想这就是你想要的?将const_cast简单地添加/删除const和在你的情况下,删除它。

于 2013-03-26T11:49:07.257 回答