您的位置:首页 > 编程语言 > C语言/C++

【C++】Digest of 《effective C++》--1

2016-05-08 10:21 363 查看

《effective C++》阅读笔记01

size_t是c++计算个数时使用的某种不带正负号(unsigned)类型。它也是vector,deque和string内的operator[]函数接受的参数类型。

分清楚声明式和定义式,对对象而言,定义式是编译器为此对象拨发内存的地点;对function 或function template而言,定义式提供了代码本身。

default构造函数要不没有参数,要不就是每个参数都有缺省值。

class B {
public:
explicit B(int x = 0, bool b = true); //这也是一个default构造函数
}


构造函数被声明为explicit可以阻止它们被用来执行隐式类型转换,但仍然可以执行显示类型转换。

void dosomething(B object) {...}

B oboj1;
dosomething(bobj1); //ok,因为dosomething接受的是一个B类型的对象
dosomething(28); //错误,dosomething接受一个B类型的对象,不是一个int, 而int和B之间没有隐式转换
dosomething(B(28)); //ok,用B的构造函数将int显式转换为B类型


因为我们一般不希望编译器执行非预期的类型转换,所以我们鼓励将构造函数声明为explicit

copy构造函数和copy assignment操作符

class A {
public:
A();
A(const A& a); // copy构造函数
A& operator= (const A& a); //copy assignment操作符
...
};

A a1;
A a2 = a1; //调用copy构造函数
a2 = a1; //调用copy assignment操作符


构造一个新的对象时使用的是copy构造函数,而不用构造新对象时的普通赋值则是调用copy assignment操作符。

copy构造函数对于pass-by-value的传递方式是非常重要的。考虑

void func(A a) {...}

A a1;
func(a1);


这里类型A的对象是pass-by-value,所以a1是被复制进去的,因此会构造一个临时的A对象,这个临时的A对象就是用copy构造函数来完成的。

然而对于自定义类型来说,pass-by-reference是更好的选择
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: