More Effective C++ 条款2 最好使用C++转型操作符

1. C转型操作几乎允许将任何类型转为任意其他类型,由此造成极大地不安全性。

2. C转型操作对所有种类的转型使用一种语法,降低了代码的可读性。而C++的转型操作符则适用于更集中(狭窄)的目的。

3. C++的转型操作符:

static_cast:几乎与C旧式转型相同的威力与意义以及相同的限制

const_cast:用于去除某个对象的常量性

用法:A* a=const_cast<A*>(&a1)       //a1是与A类型的对象

注意:

1)可以使用一个const对象经过const_cast后调用非const成员函数(否则需要对成员函数进行const重载);

2)一个const对象经过const_cast可以“改变”其值,但是实际上经过了编译器的某些处理,使得通过指针a获取的值是改变后的,但是通过a1获取的是仍然是未改变的                   (为了不违背a1的const属性)

dynamic_cast:用于进行downcast操作从而支持RTTI(运行时类型检查)

注意:

1)对于指针类型的downcast如果失败就返回空指针,对于引用类型的downcast如果失败就抛出bad_cast异常

2)要使用dynamic_cast,必须被转换的类类型必须要有至少一个虚函数,否则会在编译时报错,底层原因是由于大多数编译器对于dynamic_cast的实现是通过虚函数指针           所指向的虚函数表的第一个节点所存储的指针所指向的type_info类型的对象的比对实现的,因而若没有虚函数,也就没有虚函数指针,dynamic_cast也就无从谈起。

reinterpret_cast:”为操作数的为模式提供较低层次的重新编译"

注意:

1)所谓的”为操作数的为模式提供较低层次的重新编译"指的是操作符修改了操作数类型,但仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换,例如对于float变量         1.0,如果通过static_cast转换为int型变量则转换后的结果是1,但是如果通过reinterpret_cast则在dev-c++(windows7 32位系统)下结果是1067030938。

时间: 2024-10-11 17:50:04

More Effective C++ 条款2 最好使用C++转型操作符的相关文章

Effective C++ 条款27 尽量少做转型操作

1. 转型语法有三种, C风格转型:(T)expression 函数风格转型:T(expression) 两种方式除了小括号位置不同没有差别,可以称为"旧式转型". C++提供四种新式转型: const_cast<T>(expression): 将const变量引用或指针转为非const引用或指针,移除变量的常量特性.T必须是指针或引用. 注:虽然经const_cast转型后的变量可以被更改,但由于"常量折叠"(c++编译器在编译时将const 变量替换

条款2. 最好使用C++转型操作符

C++提供了four cast operators: static_cast,const_cast,dynamic_cast and reinterpret_cast. 1. static_cast 用来进行基本类型数值间的转换,例如:int --- char,安全由程序员进行控制. 不能用于无关类型间指针间的转换,例如:int* --- double* 编译出错. 将null pointers – other pointers. 基类和派生类之间指针或者引用的转换.up-casting (把派

More Effective C++ 条款35 让自己习惯于标准C++ 语言

(由于本书出版于1996年,因此当时的新特性现在来说可能已经习以为常,但现在重新了解反而会起到了解C++变迁的作用) 1. 1990年后C++的重要改变 1). 增加了新的语言特性:RTTI,namespaces,bool,关键词mutable和explicit,enums作为重载函数之自变量所引发的类型晋升转换,以及"在class 定义区内直接为整数型(intergral) const static class members设定初值"的能力. 2). 扩充了Templates的特性

effective c++ 条款4 make sure that objects are initialized before they are used

1 c++ 类的数据成员的初始化发生在构造函数前 class InitialData { public: int data1; int data2; InitialData(int a, int b) { data1 = a: //this is assignment data2 = b; //this is assignment } /* InitialData(int a, int b):data1(a),data2(b) //this is initial {} */ } 2 不同cpp文

More Effective C++ 条款34 如何在一个程序中结合C++和C

1. C++和C混合使用的前提之一就是编译器产生兼容的目标文件(.lib和.dll等).所谓"兼容",指的是编译器在"预编译器相依的特性上"一致,如int和double大小,参数压栈机制等,只有在这个基础上才能讨论结合使用C++和C模块的问题. 2. 在1的基础上,要结合使用C++和C的模块,主要有以下几点需要注意: 1). name mangling(名称重整) Name mangling是C++用于支持函数重载的机制,它对重载的函数名称进行一定改变,使得每个函数

Effective C++ 条款3 尽可能用const

1. const可被施加于任何作用域内的对象,函数参数,函数返回类型,成员函数本体.用const修饰指针,如果const出现在*之前,表明指针不能更改所指向的对象的内容,如果const出现在*之后,表明指针只能指向同一块内存.另外int const*p和const int*p含义相同.如果对象成员有普通指针,那么构造该类的一个const对象时,const修饰使得该指针只能指向同一块内存,但指针指向的内容可以改变. 2. 将某些东西声明为const可以帮助编译器侦测出错误用法. 3. 编译器强制实

effective c++ 条款13 use object to manage resources.

请求的系统资源需要最终还回系统,为了避免遗忘返还这个动作,可以利用析构函数在object销毁时自动调用的特点来实现. 简单说就是用object来管理资源. 以内存资源为例 class Investment {}; Investment* creatInvestment(){...} // factory function to produce investment object void main() { Investment* pInv = creatInvestment();//call t

effective c++ 条款3 use const whereever you can

1 const 传达的意思应该是这个变量是常量不能更改 2 const 在 * 左边表示数据是const,在右边表示指针是const // char greeting[] = "hello"; char* p = greeting; //const *: const data //* const: const pointer char const *p1 = greeting; // const data char * const p2 = greeting; // const poi

effective c++ 条款18 make interface easy to use correctly and hard to use incorrectly

举一个容易犯错的例子 class Date { private: int month; int day; int year; public: Date(int month,int day,int year) { this->month = month; ... } } //wrong example Date date(30,3,1995);//should be 3,30 Date date(2,30,1995);//should be 3,30 使用类型可避免这个问题 class Month