#include <iostream>
using namespace std;
class Person
{
public:
Person()
{
std::cout << "Person()" << std::endl;
}
virtual ~Person()
{
std::cout << "~Person()" << std::endl;
}
Person(const Person& p)
{
this->name_ = p.name_;
this->sex_ = p.sex_;
std::cout << "Person copy construct()" << std::endl;
}
private:
string name_;
string sex_;
};
class Student : public Person
{
public:
Student()
{
std::cout << "Student()" << ",this :"<< this << std::endl;
}
~Student()
{
std::cout << "~Student()" << ",this :" << this << std::endl;
}
Student(const Student& s): Person(s)
{
std::cout << "copy construct" << ",this :" << this << std::endl;
this->student_name_ = s.student_name_;
this->student_sex_ = s.student_sex_;
}
private:
string student_name_;
string student_sex_;
};
Student Test()
{
Student s;
return s;
}
void Test1(Student s)
{
return;
}
Student Test2(Student s)
{
return s;
}
/*
针对函数传参,及函数返回对象,有以下结论
传入参数的时候,会调用一次该类的拷贝构造函数,如果该类为子类,还会调用父类的拷贝构造函数
当该函数作用域结束时,调用该类的析构函数和其父类的析构函数。
当返回一个临时对象时,也会调用一次该类的拷贝构造函数,和其父类的拷贝构造函数
当上层作用域结束的时候,临时对象调用该类的析构函数和其父类的析构函数
*/
int main()
{
/*Student s1 = Test();
std::cout << "===============================" << std::endl;*/
Student s;
/*Test1(s);
std::cout << "===============================" << std::endl;*/
Student s1 = Test2(s);
std::cout << "===============================" << std::endl;
return 0;
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/c3306adf10954f77ac292072d607c220.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAd2VpeGluXzQyNzM0NDQ1,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)