C++(www.cppentry.com)类型转换在刚学习C++(www.cppentry.com)不久就接触到的东西,由于那会儿对C++(www.cppentry.com)机制的不熟悉,并没有太多的疑问。随着对C++(www.cppentry.com)进一步的了解,基本类型转换应该可以理解为生成了对应类型的临时变量。昨天看到了Effective C++(www.cppentry.com)条款3中,类的const与non-const重载函数,non-const函数调用const函数实现重载,即所谓的常量性转除(casting away constness)。示例程序代码如下:
class CTextBox
{
public:
CTextBox(void);
CTextBox(char *szStr);
~CTextBox(void);
const char& operator[](std::size_t pos) const
{ return m_strText[pos]; }
char& operator[](std::size_t pos)
{
return const_cast<char&>((static_cast<const CTextBox&>(*this))[pos]);
}
private:
std::string m_strText;
};
操作符重载函数operator[]的non-const版本对this*做了类型转换,使其能够调用const版本的operator[]函数,如果按照基本类型转换的临时变量理解,函数最后相当于返回了对临时变量的引用,这显然是错误的,而且不能达到程序员想要的目的。但是经过对代码的编译运行,发现程序能够通过正确运行。所以产生了如下疑问:类型转换用于常量性移除时,是否针对原变量操作,而不是生成了变量;由此考虑类型转换的其他用途,比如对于指针的转换等,是以何种方式进行的。下面引用神秘果的blog中关于C++(www.cppentry.com)类型转换的总结:
C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:
TYPE b = (TYPE)a.
C++(www.cppentry.com)风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。看似问题复杂化了,其实不然。C风格的类型转换在程序语句中难以识别,类型转换是去const,还是int转换成char,或是子类指针转换成父类指针?C括号风格的强制类型转换解决不了这些问题。C++(www.cppentry.com)的4种类型转换能够解决这些问题:
const_cast,字面上理解就是去const属性。
static_cast,命名上理解是静态类型转换。如int转换成char.
dynamic_cast,命名上理解是动态类型转换。如子类和父类之间的多台类型转换。
reinterpreter_cast,仅仅重新解释类型,但没有进行二进制的转换。
4种类型转换的格式,如:TYPE B = static_cast(TYPE)(a)。
const_cast
去掉类型的const或volatile属性。
struct SA {
int i;
};
const SA ra;
//ra.i = 10; //直接修改const类型,编译错误
SA &rb = const_cast<SA&>(ra);
rb.i = 10;
static_cast
类似于C风格的强制转换。无条件转换,静态类型转换。用于:
1、基类和子类之间转换:其中子类指针转换成父类指针是安全的;但父类指针转换成子类指针是不安全的。(基类和子类之间的动态类型转换建议用dynamic_cast)
2、基本数据类型转换。enum,struct,int,char,float等。static_cast不能进行无关类型(如非基类和子类)指针之间的转换。
3、把空指针转换成目标类型的空指针。
4、把任何类型的表达式转换成void类型。
5、static_cast不能去掉类型的const、volitale属性(用const_cast)。
1 int n = 6;
2 double d = static_cast<double>(n); // 基本类型转换
3 int *pn = &n;
4 double *d = static_cast<double *>(&n) //无关类型指针转换,编译错误
5 void *p = static_cast<void *>(pn); //任意类型转换成void类型
6
dynamic_cast