【Effective C++读书笔记】篇一(导读~条款01)

在师姐的建议下,买了《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;
}

此时就会有隐式转换,那么唯一的参数就会赋给 age 。


说到这里我们没有看到隐式转换有什么坏处啊,那么可以参考这里,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++ 的哪一部分。

你可能感兴趣的:(C++,effective)