//27
//深拷贝和浅拷贝
//28
//初始化列表
//构造函数():属性(值)
//29
//lei 对象作为类的成员,先构造A
//class A{}
//class B
// {
// A a;
// }
#include <iostream>
#include <string>
using namespace std;
//27
class Person
{
public:
Person(){
cout << "Person 的默认构造函数的调用" << endl;
}
Person(int age,int height){
m_Age = age;
m_Height = new int(height);//堆区开发的,程序员自己销毁开发,可以在堆区的数据在析构函数释放,注意使用自己的拷贝构造函数,防止前拷贝带来的问题。
cout << "Person 的又参构造函数的调用" << endl;
}
Person(const Person &p){
// m_Height =p.m_Height;这就是编译器提供的拷贝写法,前拷贝,
m_Age = p.m_Age;
m_Height = new int(*p.m_Height);//这就是深拷贝!!,重新开发一个地址。
}
~Person(){
if(m_Height != NULL){
delete m_Height;
m_Height = NULL;
}
cout << "Person 的析构函数的调用" << endl;
}
int m_Age;
int *m_Height;
};
//28
class people{
public:
//传统构造函数初始化
// people(int a){
// m_A = a;
// }
//初始化列表初始化
// people():m_A(10),m_B(20){ }
people(int a,int b):m_A(a),m_B(b){ }
int m_A;
int m_B;
};
//29
class Phone{
public:
Phone(string pname){
cout << "Phoned" << endl; //现有的Phone,再有的personed类
m_pname = pname;
}
~Phone(){
cout << "~Phoned" << endl; //与构造的顺序相反
}
string m_pname;
};
class person{
public:
person(string name ,string pname): m_name(name),m_phone(pname){
cout << "personed" << endl;
}
~person(){
cout << "~personed" << endl; //与构造的顺序相反
}
string m_name;
Phone m_phone;
};
//2827
void test01(){
Person p1(18,160);
cout << p1.m_Age << *p1.m_Height << endl;
Person p2(p1);//利用了编译器提供的拷贝构造函数,会做前拷贝,这样做哦p2已经释放过一次指针的指向了,在p1被释放时,*m_Height指针没有指向了,怎么解决,自己写拷贝构造函数,p2指向不同于p1指向的地址
cout << p2.m_Age << *p2.m_Height << endl;
people peo(10,20);
}
//29
void test02(){
person p("zhangsan","HUAWEI");
cout << p.m_name <<": "<< p.m_phone.m_pname << endl;
}
int main()
{
// test01();
test02();
return 0;
}
C++ Class 深拷贝、列表初始化(七)
最新推荐文章于 2024-03-09 20:59:13 发布
本文探讨了C++中的深拷贝和浅拷贝概念,通过Person类展示了如何实现深拷贝以避免数据丢失。同时,介绍了构造函数的使用,包括默认构造函数、有参构造函数和初始化列表。此外,还展示了类的成员对象构造顺序及其对析构的影响,以Phone和Person类为例说明。
摘要由CSDN通过智能技术生成