关于const_cast<>的行为

Behaviour about const_cast<>

本文关键字:gt lt const cast 关于      更新时间:2023-10-16

我编写了一个小问题,用于检查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*,但在强制转换之后,我仍然可以修改它。

您已经准确地描述了const_cast的作用-它允许您从某些内容中删除const并对其进行修改。不滥用这种权力取决于你自己。: -)

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

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

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

是的,你可以这样使用const_cast<>,它不会是一个未定义的行为,因为在你的类中const char*指向的对象确实是非char*类型的const。但是要小心:。c++标准。§7.1. 5.1/4表示

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

const_cast的安全用法是将const从const引用转换为非const对象:当存在非const对象并且你有const ref指向它时,你可以安全地从

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

,那么你实际上从指针中删除了const,你声明你的s是一个指向char的指针,它是一个可写的字符串。下一行

s[6]='y';

完全没问题。为了保持const,应该将s声明为const指针

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

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