关闭

More Effective C++议题【一】:指针和引用

标签: More Effective C++c++指针引用
438人阅读 评论(0) 收藏 举报
分类:

<<More Effective C++>> 学习笔记【一】
这个议题作为第一个建议出现在了 More effective ++中,
在一开始,第一件事就是提醒了我们关于指向空值的引用. 即如下代码出现的可能性:

//错误的代码!!
char *pc = 0; // 设置指针为空值
char& rc = *pc; // 让引用指向空值

并且这个建议中还非常刻薄的说道:"如果你未曾考虑过这种可能性,就让别的有经验的程序员去做"尴尬

排除此点之后, 建议一提出了以下几个观点:
1. 不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。
2. 在如下情况中使用指针而不是引用: 
2.1 一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),
2.2 二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)
3. 在如下情况中使用引用而不是指针: 
3.1 当你知道你必须指向一个对象并且不想改变其指向时
3.2 当重载某个操作符时,应该使用引用。(最普通的例子是操作符[]。这个操作符典型的用法是返回一个目标对象,其能被赋值。)


下面COPY_PASTE了建议中给出的代码示例:
1. 引用不需要合法性检查:

//不需要测试引用,它肯定指向一个值
void printDouble(const double& rd)
{
    cout << rd; // 不需要测试rd,它
} 

//相反,指针则应该总是被测试,防止其为空:
void printDouble(const double *pd)
{
   if (pd) .
   { // 检查是否为NULL
     cout << *pd;
   }
}



2. 指针在指向改变操作中具有灵活性:

    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 没有改变


3.2 重载运算符 [ ]的应用歧义性:

    vector<int> v(10); // 建立整形向量(vector),大小为10;
                       // 向量是一个在标准C库中的一个模板(见条款M35)
    //当使用引用作为重载的返回值时:
    v[5] = 10; // 这个被赋值的目标对象就是操作符[]返回的值
    //当使用指针作为重载的返回值时:
    *v[5] = 10;//如果操作符[]返回一个指针,这样会使得v看上去象是一个向量指针

这里还提到了M30中的一个小技巧,留到后面再详细讨论。

第一篇比较简单,但是比较容易被忽视!



0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场