关于const_cast<>的行为

时间:2013-03-26 11:36:57

标签: c++ const-cast

我写了一个小问题,用于检查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&lt;&gt;我们可以覆盖数据成员本身的行为,因为这里的字符串是const char *仍然在转换后我可以修改它。

3 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:1)

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

  

除了可以修改声明为mutable(7.1.1)的任何类成员,   任何在其生命周期(3.8)结果中修改const对象的尝试   未定义的行为

安全使用const_cast是为了将const从const引用转换为非const对象:当存在非const对象且你有const引用它时,你可以安全地从中转换const

答案 2 :(得分: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,在您的情况下,将其删除。