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

原创 2013年12月02日 12:58:34

<<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中的一个小技巧,留到后面再详细讨论。

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



相关文章推荐

More Effective C++议题【四】:避免无用的缺省构造函数

> 学习笔记【四】 这个议题讨论的是缺省构造函数,在分析议题之前,我们首先通论两件关于缺省(默认)构造的事情: 缺省构造函数做什么?缺省构造函数什么时候被调用? 这些答案我们去语言的说明...

《More Effective C++》重点摘要一:基础议题

仔细区别pointers和references。指针和引用有些相似,他们本身都是对存在于某个地方的对象(不是指class)的指示,但是他们有着本质的区别。指针变量存储所指对象的地址,所指的对象可以是n...

更高效的C++_More Effective CPP手记一之基础议题

基础议题 M1.指针与引用类型的选用 1.任何时候都不能使用只想控制的引用,引用一经定义,必须指向某个对象,之后不能改变。 2.如果设计中变量不能为空,应该使用引用,而且在使用时不需要对变量进行验...

《More Effective C++》读书笔记-基础议题

一、仔细区别 pointers 和 references1)引用不可以为空(必须指向某个对象),而指针可以为空。 引用带来的好处:不需要检查空引用,也就省了相应的处理代码 指针在使用前则需要判断是...
  • will130
  • will130
  • 2016年04月30日 14:56
  • 195

More Effective C++议题【六】:关于自增、自减操作符的一些讨论

> 学习笔记【六】 这个议题首先讨论的是++和--操作符的重载,为了区分前缀和后缀形式,C++语言规定后缀形式有一个int类型参数,当函数被调用时,编译器传递一个0做为int参数的值给该函数。 cla...

More Effective C++议题【二】:尽量使用C++风格的类型转换

> 学习笔记【一】 C风格的类型转换的缺点: 过于粗鲁: 允许在任何类型间进行转换。代码阅读时在程序语句中难以识别。 其中第一点在转换不同行为类型中体现出了巨大的差异性,建议中的例子包括 :...

指针和引用的区别(More Effective c++ )

指针与引用看上去完全不同(指针用操作符“*”和“->”,引用使用操作符“. ” ),但 是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候 使用指针,在什么时候使用...

More Effective C++:指针与引用的区别

转自:http://dev.yesky.com/495/2567995.shtml指针与引用看上去完全不同(指针用操作符’*’和’->’,引用使用操作符’.’),但是它们似乎有相同的功能。指针与引用都...

more effective c++之Item M1:指针与引用的区别

1.参数为引用不用判断为空,指针需要判断空指针; 2.有些函数返回应用比返回指针从语法和形式上更好,例如重载operator [ ]。 指针与引用看上去完全不同(指针用操作符“*”和“->...

More Effective C++ ——01_指针与引用的区别

条款一:指针与引用的区别  指针与引用看上去完全不同(指针用操作符’*’和’->’,引用使用操作符’.’),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。   问题:你如何决定在什么...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:More Effective C++议题【一】:指针和引用
举报原因:
原因补充:

(最多只允许输入30个字)