欢迎来到天天文库
浏览记录
ID:34585954
大小:634.64 KB
页数:150页
时间:2019-03-08
《More Effective C .pdf》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、条款一指针与引用的区别指针与引用看上去完全不同指针用操作符*和->引用使用操作符.但是它们似乎有相同的功能指针与引用都是让你间接引用其他对象你如何决定在什么时候使用指针在什么时候使用引用呢首先要认识到在任何情况下都不能用指向空值的引用一个引用必须总是指向某些对象因此如果你使用一个变量并让它指向一个对象但是该变量在某些时候也可能不指向任何对象这时你应该把变量声明为指针因为这样你可以赋空值给该变量相反如果变量肯定指向一个对象例如你的设计不允许变量为空这时你就可以把变量声明为引用但是请等一下你怀疑地问这样的代码会产生什么样的后果char*pc=0;//设置
2、指针为空值char&rc=*pc;//让引用指向空值这是非常有害的毫无疑问结果将是不确定的编译器能产生一些输出导致任何事情都有可能发生应该躲开写出这样代码的人除非他们同意改正错误如果你担心这样的代码会出现在你的软件里那么你最好完全避免使用引用要不然就去让更优秀的程序员去做我们以后将忽略一个引用指向空值的可能性因为引用肯定会指向一个对象在C里引用应被初始化string&rs;//错误引用必须被初始化strings("xyzzy");string&rs=s;//正确rs指向s指针没有这样的限制string*ps;//未初始化的指针//合法但危险不存在指向
3、空值的引用这个事实意味着使用引用的代码效率比使用指针的要高因为在使用引用之前不需要测试它的合法性voidprintDouble(constdouble&rd){cout<4、ngs2("Clancy");string&rs=s1;//rs引用s1string*ps=&s1;//ps指向s1rs=s2;//rs仍旧引用s1,//但是s1的值现在是//"Clancy"ps=&s2;//ps现在指向s2;//s1没有改变总的来说在以下情况下你应该使用指针一是你考虑到存在不指向任何对象的可能在这种情况下你能够设置指针为空二是你需要能够在不同的时刻指向不同的对象在这种情况下你能改变指针的指向如果总是指向一个对象并且一旦指向一个对象后就不会改变指向那么你应该使用引用还有一种情况就是当你重载某个操作符时你应该使用引用最普通的例子是操作5、符[]这个操作符典型的用法是返回一个目标对象其能被赋值vectorv(10);//建立整形向量vector大小为10;//向量是一个在标准C库中的一个模板(见条款35)v[5]=10;//这个被赋值的目标对象就是操作符[]返回的值如果操作符[]返回一个指针那么后一个语句就得这样写*v[5]=10;但是这样会使得v看上去象是一个向量指针因此你会选择让操作符返回一个引用这有一个有趣的例外参见条款30当你知道你必须指向一个对象并且不想改变其指向时或者在重载操作符并为防止不必要的语义误解时你不应该使用指针而在除此之外的其他情况下则应使用指针条款2尽6、量使用C++风格的类型转换仔细想想地位卑贱的类型转换功能cast其在程序设计中的地位就象goto语句一样令人鄙视但是它还不是无法令人忍受因为当在某些紧要的关头类型转换还是必需的这时它是一个必需品不过C风格的类型转换并不代表所有的类型转换功能一来它们过于粗鲁能允许你在任何类型之间进行转换不过如果要进行更精确的类型转换这会是一个优点在这些类型转换中存在着巨大的不同例如把一个指向const对象的指针pointer-to-const-object转换成指向非const对象的指针pointer-to-non-const-object(即一个仅仅去除cosnt的7、类型转换)把一个指向基类的指针转换成指向子类的指针即完全改变对象类型传统的C风格的类型转换不对上述两种转换进行区分这一点也不令人惊讶因为C风格的类型转换是为C语言设计的而不是为C++语言设计的二来C风格的类型转换在程序语句中难以识别在语法上类型转换由圆括号和标识符组成而这些可以用在C中的任何地方这使得回答象这样一个最基本的有关类型转换的问题变得很困难在这个程序中是否使用了类型转换这是因为人工阅读很可能忽略了类型转换的语句而利用象grep的工具程序也不能从语句构成上区分出它们来C++通过引进四个新的类型转换操作符克服了C风格类型转换的缺点这四个操作符是8、,static_cast,const_cast,dynamic_cast,和reinterpret_cast
4、ngs2("Clancy");string&rs=s1;//rs引用s1string*ps=&s1;//ps指向s1rs=s2;//rs仍旧引用s1,//但是s1的值现在是//"Clancy"ps=&s2;//ps现在指向s2;//s1没有改变总的来说在以下情况下你应该使用指针一是你考虑到存在不指向任何对象的可能在这种情况下你能够设置指针为空二是你需要能够在不同的时刻指向不同的对象在这种情况下你能改变指针的指向如果总是指向一个对象并且一旦指向一个对象后就不会改变指向那么你应该使用引用还有一种情况就是当你重载某个操作符时你应该使用引用最普通的例子是操作
5、符[]这个操作符典型的用法是返回一个目标对象其能被赋值vectorv(10);//建立整形向量vector大小为10;//向量是一个在标准C库中的一个模板(见条款35)v[5]=10;//这个被赋值的目标对象就是操作符[]返回的值如果操作符[]返回一个指针那么后一个语句就得这样写*v[5]=10;但是这样会使得v看上去象是一个向量指针因此你会选择让操作符返回一个引用这有一个有趣的例外参见条款30当你知道你必须指向一个对象并且不想改变其指向时或者在重载操作符并为防止不必要的语义误解时你不应该使用指针而在除此之外的其他情况下则应使用指针条款2尽
6、量使用C++风格的类型转换仔细想想地位卑贱的类型转换功能cast其在程序设计中的地位就象goto语句一样令人鄙视但是它还不是无法令人忍受因为当在某些紧要的关头类型转换还是必需的这时它是一个必需品不过C风格的类型转换并不代表所有的类型转换功能一来它们过于粗鲁能允许你在任何类型之间进行转换不过如果要进行更精确的类型转换这会是一个优点在这些类型转换中存在着巨大的不同例如把一个指向const对象的指针pointer-to-const-object转换成指向非const对象的指针pointer-to-non-const-object(即一个仅仅去除cosnt的
7、类型转换)把一个指向基类的指针转换成指向子类的指针即完全改变对象类型传统的C风格的类型转换不对上述两种转换进行区分这一点也不令人惊讶因为C风格的类型转换是为C语言设计的而不是为C++语言设计的二来C风格的类型转换在程序语句中难以识别在语法上类型转换由圆括号和标识符组成而这些可以用在C中的任何地方这使得回答象这样一个最基本的有关类型转换的问题变得很困难在这个程序中是否使用了类型转换这是因为人工阅读很可能忽略了类型转换的语句而利用象grep的工具程序也不能从语句构成上区分出它们来C++通过引进四个新的类型转换操作符克服了C风格类型转换的缺点这四个操作符是
8、,static_cast,const_cast,dynamic_cast,和reinterpret_cast
此文档下载收益归作者所有