#include <cstdio> class exmp { public: /* exmp(): _x(0), _y(0) {}; // 初始化成员列表 exmp() { _x = 0; _y = 0; }; // 赋初值 初始化成员列表和赋值的区别: */ exmp(): _x(0), _y(0) {}; /* exmp(int x) 这个构造函数使得类具有了类似 exmp tmp = 5; 的初始化能力 实际上是隐式调用了此构造函数 exmp tmp = 5; => exmp tmp = exmp(5); 或 exmp tmp; tmp = 5; => tmp = exmp(5); 如果定义了 exmp& operator=(const int tmp) 会有如下转换,C++选择最相近的语义处理 tmp = 5; => tmp.operator=(5); */ exmp(int x): _x(x), _y(0) {}; /* 如上所述声明了单参数构造函数,会有tmp = 5这种隐式转换发生 为了避免混淆,用explicit关键字表明该构造函数必须显式调用,不能用于隐式强制转换 使如 exmp tmp = 5; 初始化不可用. 形如 exmp tmp = exmp(5); 显式调用方式可用 如果没有定义=号操作符 exmp tmp; tmp = 5; // 使用了explicit导致隐式转换不可用 这种赋值也不可用 某些情况下我们不希望发生tmp = 5类型的赋值,则必须把构造函数声明为explicit */ // explicit exmp(int x): _x(x), _y(0) {}; exmp(int x, int y): _x(x), _y(y) {}; /* 如果定义了带有默认值的构造函数, exmp(); exmp(int x); exmp(int x, int y); 就都不用声明了, 否则会报错函数重定义 error C2535: '__thiscall exmp::exmp(int,int)' : member function already defined or declared */ //exmp(int x=0, int y=0): _x(x), _y(y) {}; exmp& operator=(const exmp &tmp); /* operator= 并不能使如 exmp tmp = 6; 隐式转换的初始化可用. 只有如下方式可用 exmp tmp; tmp = 5; => tmp.operator=(5); */ exmp& operator=(const int tmp) { _x = tmp; return *this;}; private: int _x; int _y; }; int main(int argc, char* argv[]) { exmp tmp = 6; tmp = 5; printf("Hello World!/n"); return 0; }