【C/C++学习】之三、const_cast
2012-08-04 14:45
183 查看
用法:const_cast<type_id> (expression)
此运算符是用来消除类型的const和volatile属性的。
看到const_cast的你应该知道,他是用来转换掉表达式的const性质的。对也,只有使用我们的const_cast才能将const性质转换掉!
ok,我们来看一段代码:
const char m = 't';
const char *cm = &m;
char *n = const_cast<char*>(cm);
*n = 'a';
cout << *n << endl;
很好,代码编译通过,你应该能看的出来,他的结果不应该是‘t'吧,对的 最后的输出结果是’a',我们给n指针所指向的变量重新变了值了~ 很好,这就是我们的const_cast的功劳!
但是如果是这样:
const char m = 't';
const char *cm = &m;
char *n = cm;
*n = 'a';
cout << *n << endl;
很悲剧,无法编译通过!
看到上面两段代码大家应该稍微有点明白了吧,但是再看下面:
const char m = 't';
const char *cm = &m;
char *n = (char*)cm;
*n = 'a';
cout << *n << endl;
oh。。编译也是通过的,而且最后的结果还是a~~,这是为什么呢 ?
其实,在C++中,指针之间的转换是不检查类型的,他们是任意转换的,什么指针都可以转换!
就是这样!
哦 对了,const_cast是不能用来执行任何类型的转换的,这样都会引起编译错误的!
const char m = 't';
const char *cm = &m;
int *n = const_cast<int*>(cm);
*n = 'a';
cout << *n << endl;
很不幸,这段代码报错了,看一下错误提示:
![](http://my.csdn.net/uploads/201208/04/1344062605_3212.png)
oh~ 确实是这样的!
说到这里我想说一下,绝对不要去修改const变量的值, 但是这样说的话要const_cast有什么用呢?
在这里《C++Primer 第四版》中有一个例子,假设有一个函数s,他有一个唯一的参数是char*类型的,我们对他只读,不写! 在访问这个函数的时候,我们最好的选择是修改它让它接受const char*类型的参数! 但是如果不行的话
我们就要用const_cast,用一个const值调用s函数了!
void s(char *)
{
cout << 'a' << endl;
}
char a = 's';
const char *ss = &a;
s(const_cast<char*> (ss));
ok,我们编译通过了!
不过我在写代码的时候const_cast 用的很少!
-----------2012/8/4
-----------jofranks 于南昌
此运算符是用来消除类型的const和volatile属性的。
看到const_cast的你应该知道,他是用来转换掉表达式的const性质的。对也,只有使用我们的const_cast才能将const性质转换掉!
ok,我们来看一段代码:
const char m = 't';
const char *cm = &m;
char *n = const_cast<char*>(cm);
*n = 'a';
cout << *n << endl;
很好,代码编译通过,你应该能看的出来,他的结果不应该是‘t'吧,对的 最后的输出结果是’a',我们给n指针所指向的变量重新变了值了~ 很好,这就是我们的const_cast的功劳!
但是如果是这样:
const char m = 't';
const char *cm = &m;
char *n = cm;
*n = 'a';
cout << *n << endl;
很悲剧,无法编译通过!
看到上面两段代码大家应该稍微有点明白了吧,但是再看下面:
const char m = 't';
const char *cm = &m;
char *n = (char*)cm;
*n = 'a';
cout << *n << endl;
oh。。编译也是通过的,而且最后的结果还是a~~,这是为什么呢 ?
其实,在C++中,指针之间的转换是不检查类型的,他们是任意转换的,什么指针都可以转换!
就是这样!
哦 对了,const_cast是不能用来执行任何类型的转换的,这样都会引起编译错误的!
const char m = 't';
const char *cm = &m;
int *n = const_cast<int*>(cm);
*n = 'a';
cout << *n << endl;
很不幸,这段代码报错了,看一下错误提示:
![](http://my.csdn.net/uploads/201208/04/1344062605_3212.png)
oh~ 确实是这样的!
说到这里我想说一下,绝对不要去修改const变量的值, 但是这样说的话要const_cast有什么用呢?
在这里《C++Primer 第四版》中有一个例子,假设有一个函数s,他有一个唯一的参数是char*类型的,我们对他只读,不写! 在访问这个函数的时候,我们最好的选择是修改它让它接受const char*类型的参数! 但是如果不行的话
我们就要用const_cast,用一个const值调用s函数了!
void s(char *)
{
cout << 'a' << endl;
}
char a = 's';
const char *ss = &a;
s(const_cast<char*> (ss));
ok,我们编译通过了!
不过我在写代码的时候const_cast 用的很少!
-----------2012/8/4
-----------jofranks 于南昌
相关文章推荐
- C++ 学习笔记(4)表达式、运算符、类型转换(static_cast、const_cast、reinterpret_cast、dynamic_cast)
- C++学习笔记之——显示类型转换(static_cast,const_cast,interpret_cast,dynamic_cast)
- 【C/C++学习】之三、const_cast
- 学习: c++类型转换reinterpret_cast、 const_cast、static_cast、dynamic_cast
- C++学习笔记:const_cast类型转化
- C++中的4种cast学习(dynamic_cast, static_cast, reinterpret_cast, const_cast)
- c++学习-static_cast、dynamic_cast、const_cast和reinterpret_cast总结
- C++学习 C++类型转换static_cast, dynamic_cast, const_cast探讨
- C++ 学习笔记(3) const_cast
- 【C/C++学习】const关键字的理解
- 【C++专题】static_cast, dynamic_cast, const_cast探讨
- 谈谈C++的类型转换符 static_cast、dynamic_cast、const_cast、reinterpret_cast
- c++学习笔记-------const限定修饰符和引用
- 【C++专题】static_cast, dynamic_cast, const_cast探讨
- C++学习笔记1-const引用
- C++类型转换 static_cast, dynamic_cast, reinterpret_cast, const_cast
- 标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast(转载)
- 我的C++学习日记——关于const数值变量,指针和引用的理解
- C++中static_cast, dynamic_cast, const_cast, reinterpret_cast
- C++学习之const一般用法