首页 > 代码库 > 《Effective C++》学习笔记(一)

《Effective C++》学习笔记(一)

原创文章,转载请注明出处:http://blog.csdn.net/sfh366958228/article/details/38701767


前言

《C++ Primer》与《Effectivec++》一直是C++程序员们公认的红宝书书籍,这次带来便是《Effective C++》的学习笔记及心得。

《Effective C++》是一本条款式的书籍,所以在看的时候并没有完全按照书的编排顺序来看。

好了,废话不多说了,让我们进入正题。

 

条款01:视C++为一个语言联邦

对于C++的最初理解就是加上面上对象概念的C语言,在学习了《C++ Primer》后发现并不是这样。

现今的C++已经是一个多重范式编程语言,一个同时支持过程形式、面向对象形式、函数形式、泛型形式、元编程形式的语言。所以对于所有的“适当用法”似乎都有例外,在使用各种C++高效编程守则的同时,应视情况而变化,不应死板使用。


总结:

C++高效编程守则视状况而变化,取决于你使用C++的哪一个部分。

           

条款20:使用“常量引用传递(pass-by-reference-to-const)”来代替“值传递(pass-by-value)”

在默认情况下,C++是以值传递(继承自C语言)来将对象传至函数内。除非另外指定,否则函数的参数都是以实际参数的副本为初值,这些副本由对象的拷贝构造函数参数,最后还要经过析构函数释放,在此过程中会造成不必要得资源浪费。

特别是在一个结构复杂的类中,例如:

 

class Student : public Person {
public:
     student();
     ~student();
private:
     std::string name;
}

 

Student类继承自Person类,并且还有一个string类型的成员变量,所以当他被拷贝的话,不仅自己要被构造、析构,name、Person类、以及Person类的成员变量、Person类的父类等都得被构造、析构。

所以可以将值传递方式的函数进行优化,如下

 

bool validateStudent(Student s);// 优化前
bool validateStudent(const Student &s);// 优化后


这样的话效率将大大提高。
不仅如此,通过引用传递可以避免派生类被视作一个基类的情况(因为派生类通过基类的拷贝构造函数创建了一个只有基类属性的副本)。

但是并不是任何时候使用引用传递都会比使用值传递效率高,因为引用传递往往意味着传递指针,所以如果参数是内置类型的话,通过值传递会比引用传递效率高。

在STL的迭代器与函数对象中,使用值传递效率也会比引用传递高,因为习惯上他们都被设计为值传递。

 

总结:

1)尽量以引用传递代替值传递,前者往往效率更高,并可以避免切割问题。

2)这个规则并不适用于内置类型、以及STL的迭代器和函数对象。对他们而言,值传递效率更高。

 

条款21:必须返回对象时,别妄想返回其reference

当一个对象是本地对象时,当函数结束时,对象就被销毁了,如果这事返回一个reference,由于指向一个已被销毁的对象,所以此时会坠入“无定义行为”的恶地。
如果在函数内,对象是在堆里由new创建,依旧得进行一次函数的构造,与此同时,还得面临另一个问题:谁该对你new出来的对象实施delete?即便使用函数的人可能会delete,但是处于良好的意思,最好不要这么使用。
堆和栈里创建的对象都不能返回reference,static对象也不行,因为这样会导致如果同时调用两个该是不同结果的此函数的,结果是同一个。

总结:

绝对不要返回指针或者引用指向一个本地的栈对象,或者返回引用指向一个heap-allocated对象,或返回指针或引用指向一个本地的静态对象而可能同时需要多个这样的对象。