构造函数的分类和调用
分类方式:有参无参
调用方式:括号法,显示法,隐式转换法
-
分类:
//分类:有参和无参 class Person { public: Person() { cout << "Person类的无参构造" << endl; } Person(string name,int a) { this->name = name; this->age = a; cout << "Person类的有参构造" << endl; } //拷贝构造函数:引用是传入张三本体进行拷贝,const是防止修改张三本体 Person(const Person &p) { this->age = p.age;//将传入的人身上的所有属性拷贝到我身上 this->name = p.name; cout << "Person类的拷贝构造函数" << endl; } int age; string name; void show() { cout << this->name << endl; cout << this->age << endl; } ~Person() { cout << "Person类的析构函数" << endl; } }; int main() { Person p1("小明", 23); Person p2; Person p3(p1); p1.show(); p2.show(); p3.show(); system("pause"); return 0; }
-
调用:
括号法与显示法
int main() { //括号法: Person p1("小明", 23);//括号法调用有参 Person p2;//默认调用无参 Person p3(p1); //注意:不能这么写:Person p1();编译器会认为这是一个函数的声明 cout << "------------------" << endl; p1.show(); cout << "------------------" << endl; p2.show(); cout << "------------------" << endl; p3.show(); cout << "------------------" << endl; //显示法: Person person = Person("小花", 20); cout << "------------------" << endl; //显示法调用拷贝构造 Person person1 = Person(person);//或者是 Person person1=person; person.show(); person1.show(); //匿名对象:特点是:当前行执行结束后,系统会立即回收掉匿名对象 Person("小绿",10); cout << "aaaaaaaaaaaaa" << endl; system("pause"); return 0; }
其中,匿名对象是执行完立即回收,所以先执行析构函数再打印aaaaaaaa
注意:
//显示法调用拷贝构造 Person person1 = Person(person);//或者是 Person person1=person; //注意:不要创建以(拷贝构造创建的对象)为模板的创建匿名对象 //如:Person(person1); //匿名对象括号里传入的是另一个对象,表示匿名拷贝构造,但括号里的对象本身就是拷贝构造创建出来的对象 //编译器会认为这是一个对象的声明,即认为 Person person1; 会出现重定义的报错
隐式转换法:
//隐式转换法 Person p4 = {"小红", 30};//相当于 Person p4=Person("小红", 30); Person p5 = p4;//隐式转换法的拷贝构造
来源:b站黑马