在师姐的建议下,买了《Effective C++》这本书,打算用一个月的零散时间看完,并用这个专栏来记录我的学习心得。
导读
#1
关键字 explicit 用来阻止构造函数的隐式转换。
被声明为explicit的构造函数通常比其non-explicit兄弟更受欢迎。因为它们禁止编译器执行非预期(往往也不被期望)的类型转换。除非我有一个好理由允许构造函数被用于隐式类型转换,否则我会把它声明为explicit。我鼓励你遵循相同的政策。
需要注意的是,该关键字只能用在类构造函数上。让我们用例子来说明:
#include <iostream> using namespace std; class boy { public: int age; boy(int _age):age(_age){} }; class girl { public: int age; explicit girl(int _age):age(_age){} //使用 explicit 阻止隐式转换 }; int main() { boy b1(1); boy b2 = 2; girl g1(1); girl g2 = 2; //编译报错,error: conversion from ‘int’ to non-scalar type ‘girl’ return 0; }
例如:
#include <iostream> using namespace std; class boy { public: int age; int height; boy(int _age = 0, int _height = 50):age(_age), height(_height){} }; int main() { boy b = 2; return 0; }
说到这里我们没有看到隐式转换有什么坏处啊,那么可以参考这里,explicit 可以有效防止构造函数的隐式转换带来的错误或者误解:http://www.cnblogs.com/cutepig/archive/2009/01/14/1375917.html
#2
"=" 等号即可以用作赋值函数,也可用作拷贝构造函数。
幸运的是 “copy构造” 很容易和 “copy赋值” 有所区别。如果一个新对象被定义,一定会有个构造函数被调用,不可能是赋值操作。如果没有新对象被定义,就不会有构造函数被调用,那么当然就是赋值操作被调用。
举个例子:
#include <iostream> using namespace std; class boy { public: int age; int height; boy(int _age, int _height):age(_age), height(_height){} boy(const boy &b){age = 19; height = 170;} boy& operator=(const boy &b){age = 21; height = 180;} void display(){cout << age << " " << height << endl;} }; int main() { boy b1(20, 175); boy b2 = b1; //调用拷贝构造函数 b2.display(); b2 = b1; //调用赋值函数 b2.display(); return 0; }
完成导读的内容,我们以条款1结束这节的内容。
条款01:视C++为一个语言联邦
为更好的理解C++,我们其看做四个部分,每个部分有各自的规约:
1)C
2)Object-Oriented C++
3)Template C++
这是 C++ 的泛型编程(generic programming)部分,也是大多数程序员经验最少的部分。
4)STL
请记住:C++ 高效编程守则是状况而变化,取决于你使用 C++ 的哪一部分。