构造函数的分类和调用

分类方式:有参无参

调用方式:括号法,显示法,隐式转换法

  1. 分类:

//分类:有参和无参
 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;
 }

image-20211210133243099

  1. 调用:

括号法与显示法

 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;
 }

image-20211210142154422

其中,匿名对象是执行完立即回收,所以先执行析构函数再打印aaaaaaaa

注意:

 //显示法调用拷贝构造
     Person person1 = Person(person);//或者是 Person person1=person;
     //注意:不要创建以(拷贝构造创建的对象)为模板的创建匿名对象
     //如:Person(person1);
     //匿名对象括号里传入的是另一个对象,表示匿名拷贝构造,但括号里的对象本身就是拷贝构造创建出来的对象
     //编译器会认为这是一个对象的声明,即认为 Person person1; 会出现重定义的报错

隐式转换法:

 //隐式转换法
     Person p4 = {"小红", 30};//相当于 Person p4=Person("小红", 30);
 ​
     Person p5 = p4;//隐式转换法的拷贝构造

来源:b站黑马

posted on 2021-12-10 17:03  托马斯源  阅读(45)  评论(0编辑  收藏  举报