class Person { public: int id; string name;
public: Person() { this->id = 200; cout << "wu can gou zao han shu" << endl; }
Person(int id, string name) { this->id = id; this->name = name; cout << "you can gou zao han shu" << endl; }
Person(int id); };
Person::Person(int id) { this->id = id; cout << "id gou zao" << endl; }
/** * @brief * 整形初始化的几种方式 */ void TestIntInit() { int i1 = 100; int i2{100}; int i3(100); int i5 = int{100}; int i6 = int(100); int i4 = {100}; }
/** * @brief * 有参构造函数的几种写法 */ void TestPersonParamInit() { Person pp1(1, "qiumc"); Person pp2{1, "qiumc"}; Person pp3 = Person(1, "qiumc"); Person pp4 = Person{1, "qimmc"}; Person pp5 = {1, "qiumc"}; }
/** * @brief * 无参构造函数的几种写法 */ void TestPersonInit() { // 不能写成Person p1();因为这里无法和函数声明相区分开 Person p1; Person p2{}; Person p3 = Person(); Person p4 = Person{}; Person p5 = {}; }
/** * @brief * 一个参数的构造函数的简写方式 */ void TestPersonSingleParamInit() { // 如果没有类型符合的单参构造函数,这四种写法都会报错 // 下面这些都是发生了隐式转化 // 构造函数被声明为explicit时候,会禁止所有当前自定义类的隐式类型转换,所以如果explicit修饰构造函数后,下面变量的定义都会报错 // explicit ,当有一个构造函数的定义和声明的时候,只能出现在构造函数声明处,不能出现在构造函数的定义处 Person p1 = 100; // id = 100 Person p2 = (200); // id = 200 Person p3 = (1, 2, 3, 4); // id = 4 Person p4 = {1}; //这种形式也是一种类型的隐式转化 cout << p1.id << ":" << p2.id << ":" << p3.id << endl; }
/** * @brief * 拷贝构造函数的几种写法 */ void TestPersonCopy() { Person pp(1, "qiumc"); Person pp1(pp); Person pp2{pp}; Person pp3 = Person(pp); Person pp4 = Person{pp}; Person pp5 = {pp}; } /** * @brief * 注意整型数据初始化,和自定义类型初始化,基本上是可以类比的。 */ int main(int argc, char const* argv[]) { TestPersonSingleParamInit(); }