标签:
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
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
标签:
原文地址:http://blog.csdn.net/summer_06/article/details/51344421