[英]Behaviour about 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 <>,我们可以覆盖数据成员本身的行为,因为在转换后,字符串仍为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)之外,任何在其生存期(3.8)内修改const对象的尝试都会导致未定义的行为
安全使用const_cast是将const从const引用转换为非const对象:当存在非const对象并且您具有const ref时,可以从此安全地转换const
如果你说
char *s =const_cast<char*>(m->getString());
然后从指针中删除“ const”,然后将s
声明为指向char的指针,这是一个可写的字符串。 所以下一行
s[6]='y';
很好。 要保留const,您应该将s
声明为const指针
const char *s = m->getString();
在这种情况下,您将无法覆盖常量字符串(错误:分配只读位置)。 我以为那是你想要的? const_cast
将仅添加/删除const
,在您的情况下,将其删除。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.