
- #include
-
- using namespace std;
- class Per
- {
- friend class Stu;
- private:
- string name;
- int age;
- int *height;
- int *weight;
- public:
- Per()//per的无参构造函数
- {
- cout <<"Per的无参构造函数" << endl;
- }
- Per(string name,int age,int height,int weight):name(name),age(age),height(new int(height)),weight(new int(weight))//Per的有参构造函数,并使用初始化列表初始化
- {
- cout << "Per的有参构造函数" << endl;
- }
- Per(const Per &other):name(other.name),age(other.age),height(new int (*other.height)),weight(new int (*other.weight))//Per的拷贝构造函数
- {
- cout << "Per的拷贝构造函数" << endl;
- }
- Per &operator=(const Per &other)//Per的拷贝赋值函数
- {
- if(this!=&other)//避免自己给自己赋值
- {
- name=other.name;
- age=other.age;
- height=new int(*(other.height));
- weight=new int(*(other.weight));
- }
- cout << "Per的拷贝赋值函数" <
- return *this;
- }
- ~Per()
- {
- cout << "Per的析构函数" << endl;
- delete weight;
- delete height;
- weight=nullptr;
- height=nullptr;
-
- }
- void show()
- {
- cout << name << " " << age << " " << *height << " " << *weight << endl;
- }
- };
-
- class Stu
- {
- private:
- double score;
- Per p1;
- public:
- Stu()//Stu的无参构造函数
- {
- cout << "Stu的无参构造函数" << endl;
-
- }
- Stu(double score,Per &p1):score(score),p1(p1)//Stu的有参构造函数
- {
- cout << "Stu的有参构造函数" << endl;
- }
- Stu(const Stu &other):score(other.score),p1(other.p1)//Stu的拷贝构造函数
- {
- cout << "Stu的拷贝构造函数" << endl;
- }
- Stu &operator=(const Stu &other)//Stu的拷贝赋值函数
- {
- if(this!=&other)
- {
- score=other.score;
- p1=other.p1;
- }
- return *this;
- cout << "Stu的拷贝赋值函数" << endl;
- }
- ~Stu()
- {
- cout << "Stu的析构函数" << endl;
- }
- void show()
- {
- cout << score << " " <
" " << p1.age << " " << *p1.height << " " << *p1.weight << endl;//这里要访问Per类里private里的成员所以要在Per类增加友元 - }
- };
- int main()
- {
- Per s1;//调用Per无参构造函数
- Per s2("张三",18,180,75);//调用Per有参构造函数
- Per s3(s2);//调用Per的拷贝构造函数
- Per s4;
- s4=s3;//调用Per的拷贝赋值函数
- s4.show();
- cout << "--------------------------------" << endl;
- Stu b1;//stu无参构造函数
- Stu b2(100,s2);//stu有参构造函数
- Stu b3(b2);//stu拷贝构造函数
- Stu b4;
- b4=b3;//stu拷贝赋值函数
- b4.show();
-
- return 0;
- }
