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

《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是更好的选择

你可能感兴趣的:(【C++】Digest of 《effective C++》--1)