- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2MoreEffectiveC
条款1 指针与引用的区别
指针与引用看上去完全不同 指针用操作符 * 和 - 引用使用操作符 .
但是它们似乎有相同的功能 指针与引用都是让你间接引用其他对象 你如何决
定在什么时候使用指针 在什么时候使用引用呢
首先 要认识到在任何情况下都不能用指向空值的引用 一个引用必须总是指向
某些对象 因此如果你使用一个变量并让它指向一个对象 但是该变量在某些时
候也可能不指向任何对象 这时你应该把变量声明为指针 因为这样你可以赋空
值给该变量 相反 如果变量肯定指向一个对象 例如你的设计不允许变量为空
这时你就可以把变量声明为引用
但是 请等一下 你怀疑地问 这样的代码会产生什么样的后果
char *pc = 0; // 设置指针为空值
char rc = *pc; // 让引用指向空值
这是非常有害的 毫无疑问 结果将是不确定的 编译器能产生一些输出 导致
任何事情都有可能发生 应该躲开写出这样代码的人除非他们同意改正错误
如果你担心这样的代码会出现在你的软件里 那么你最好完全避免使用引用 要
不然就去让更优秀的程序员去做 我们以后将忽略一个引用指向空值的可能性
因为引用肯定会指向一个对象 在C里 引用应被初始化
string rs; // 错误 引用必须被初始化
string s(xyzzy);
string rs = s; // 正确 rs 指向s
指针没有这样的限制
string *ps; // 未初始化的指针
// 合法但危险
不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高
因为在使用引用之前不需要测试它的合法性
void printDouble(const double rd)
{
cout rd; // 不需要测试rd,它
} // 肯定指向一个double 值
相反 指针则应该总是被测试 防止其为空
void printDouble(const double *pd)
{
if (pd) { // 检查是否为NULL
cout *pd;
}
}
指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对
象 但是引用则总是指向在初始化时被指定的对象 以后不能改变
string s1(Nancy);
string s2(Clancy);
string rs = s1; // rs 引用 s1
string *ps = s1; // ps 指向 s1
rs = s2; // rs 仍旧引用s1,
// 但是 s1 的值现在是
// Clancy
ps = s2; // ps 现在指向 s2;
// s1 没有改变
总的来说 在以下情况下你应该使用指针 一是你考虑到存在不指向任何对象的
可能 在这种情况下 你能够设置指针为空 二是你需要能够在不同的时刻指
向不同的对象 在这种情况下 你能改变指针的指向 如果总是指向一个对象
并且一旦指向一个对象后就不会改变指向 那么你应该使用引用
还有一种情况 就是当你重载某个操作符时 你应该使用引用 最普通的例子是
操作符[] 这个操作符典型的用法是返回一个目标对象 其能被赋值
vectorint v(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 的类型转换) 把一
文档评论(0)