如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
条款一指针与引用的区别指针与引用看上去完全不同指针用操作符*和->引用使用操作符.但是它们似乎有相同的功能指针与引用都是让你间接引用其他对象你如何决定在什么时候使用指针在什么时候使用引用呢首先要认识到在任何情况下都不能用指向空值的引用一鲆帽匦胱苁侵赶?某些对象因此如果你使用一个变量并让它指向一个对象但是该变量在某些时候也可能不指向任何对象这时你应该把变量声明为指针因为这样你可以赋空值给该变量相反如果变量肯定指向一个对象例如你的设计不允许变量为空这时你就可以把变量声明为引用但是请等一下你怀疑地问这样的代码会产生什么样的后果char*pc=0;//设置指针为空值char&rc=*pc;//让引用指向空值这是非常有害的毫无疑问结果将是不确定的编译器能产生一些输出导致任何事情都有可能发生应该躲开写出这样代码的人除非他们同意改正错误如果你担心这样的代码会出现在你的软件里那么你最好完全避免使用引用要不然就去让更优秀的程序员去做我们以后将忽略一个引用指向空值的可能性因为引用肯定会指向一个对象在C里引用应被初始化string&rs;//错误引用必须被初始化strings("xyzzy");string&rs=s;//正确rs指向s指针没有这样的限制string*ps;//未初始化的指针//合法但危险不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高因为在使用引用之前不需要测试它的合法性voidprintDouble(constdouble&rd){coutv(10);//建立整形向量vector大小为10;//向量是一个在标准C库中的一个模板(见条款35)v[5]=10;//这个被赋值的目标对象就是操作符[]返回的值如果操作符[]返回一个指针那么后一个语句就得这样写*v[5]=10;但是这样会使得v看上去象是一个向量指针因此你会选择让操作符返回一个引用这有一个有趣的例外参见条款30当你知道你必须指向一个对象并且不想改变其指向时或者在重载操作符并为防止不必要的语义误解时你不应该使用指针而在除此之外的其他情况下则应使用指针条款2尽量使用C++风格的类型转换仔细想想地位卑贱的类型转换功能cast其在程序设计中的地位就象goto语句一样令人鄙视但是它还不是无法令人忍受因为当在某些紧要的关头类型转换还是必需的这时它是一个必需品不过C风格的类型转换并不代表所有的类型转换功能一来它们过于粗鲁能允许你在任何类型之间进行转换不过如果要进行更精确的类型转换这会是一个优点在这些类型转换中存在着巨大的不同例如把一个指向const对象的指针pointer-to-const-object转换成指向非const对象的指针pointer-to-non-const-object(即一个仅仅去除cosnt的类型转换)把一个指向基类的指针转换成指向子类的指针即完全改变对象类型传统的C风格的类型转换不对上述两种转换进行区分这一点也不令人惊讶因为C风格的类型转换是为C语言设计的而不是为C++语言设计的二来C风格的类型转换在程序语句中难以识别在语法上类型转换由圆括号和标识符组成而这些可以用在C中的任何地方这使得回答象这样一个最基本的有关类型转换的问题变得很困难在这个程序中是否使用了类型转换这是因为人工阅读很可能忽略了类型转换的语句而利用象grep的工具程序也不能从语句构成上区分出它们来C++通过引进四个新的类型转换操作符克服了C风格类型转换的缺点这四个操作符是,static_cast,const_cast,dynamic_cast,和reinterpret_cast在大多数情况下对于这些操作符你只需要知道原来你习惯于这样写(type)expression而现在你总应该这样写static_cast(expression)例如假设你想把一个int转换成double以便让包含int类型变量的表达式产生出浮点数值的结果如果用C风格的类型转换你能这样写intfirstNumber,secondNumber;...doubleresult=((double)firstNumber)/secondNumber如果用上述新的类型转换方法你应该这样写doubleresult=static_cast(firstNumber)/secondNumber;这样的类型转换不论是对人工还是对程序都很容易识别static_cast在功能上基本上与C风格的类型转换一样强