关于const_cast<>的行为
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)都可以被修改之外,在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
,在您的情况下,删除它。
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中