声明式:告诉某个东西的名称和类型,但略去细节;
extern int x; //对象声明式
std::size_t numDigits(int number);//函数声明式
class Widget; //类声明式
template<typename T>
class GraphNode; //模板声明式
函数声明揭示其签名式,也就是参数和返回类型。一个函数的签名等同于该函数的类型。
numDigits的签名:std::size_t (int).
定义式:为编译器提供声明式所遗漏的细节。
对对象而言:拨发内存的地点
对函数/函数模板而言:提供代码本体
对类/模板类而言:列出它们的成员
int x;//对象的定义式
std::size_t numDigits(int number) {...}//函数的定义式
初始化是给予对象初值的过程。
用户自定义类型的对象的初始化由构造函数执行。
default构造函数:一个可被调用而不带任何实参者。
class A{
public:
A();
};
class B{
public:
explicit B(int x=0, bool b = true); //注意,这也是default构造函数
};
class C{
public:
explicit C(int x);//non-default 构造函数
};
explicit:拒绝隐式类型转换,但仍可被用来进行显式类型转换。
void doSomething(B bObj);
B b1(14);
doSomething(b1);
doSomething(14);//错误!不支持隐式转换
doSomething(B(14));//正确,显式转换
将构造函数声明为explicit可以禁止编译器执行非预期类型转换。它通常更受欢迎。
“=”语法也可用来调用copy构造函数:
Widget w1; //default构造
Widget w2(w1); //copy构造
w2 = w1; //copy赋值操作符
Widget w3 = w2; //注意:此处调用了copy构造
区别“=”是copy构造还是copy赋值:
是否是一个新对象被定义。
pass by value意味着调用copy构造函数。
用户自定义类型pass by reference to const往往是个比较好的选择。