封装:
封装是C++面向对象三大特性之一
封装的意义:
- 将属性和行为作为一个整体,表现生活中的事物
 - 将属性和行为加以权限控制
 
封装意义一:
- 在设计类的时候,属性和行为写在一起,表现事物
 - **语法:**class 类名{访问权限: 属性/行为};
 - 注意:
- 属性和行为统称为成员
 - 属性又称为成员属性
 - 行为又称为成员函数、成员方法
 
 
封装意义二:
- 类在设计时,可以把属性和行为放在不同的权限下,加以控制
 
浅拷贝:
同一类型的对象之间可以赋值,使得两个对象的成员变量的值相同,两个对象仍然是独立的两个对象,这种情况被称为浅拷贝。
一般情况下,浅拷贝没有任何副作用,但是当类中有指针,并且指针指向动态分配的内存空间,析构函数做了动态内存释放的处理,会导致内存问题。

深拷贝:
当类中有指针,并且此指针有动态分配空间,析构函数做了释放处理,往往需要自定义拷贝构造函数,自行给指针动态分配空间, 深拷贝。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46class 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)
{
cout<<"Person的拷贝构造函数"<<endl;
m_Age=p.m_Age;
//m_Height=p.m_Height;编译器默认实现的时候会写这行代码,但是会造成堆区内存重复释放
//深拷贝操作
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;
};
void test01()
{
Person p1(18,160);
cout<<"p1的年龄为:"<<p1.m_Age<<"p1的身高为:"<<*p1.m_Height<<endl;
Person p2(p1);
cout<<"p2的年龄为:"<<p2.m_Age<<"p2的身高为:"<<*p2.m_Height<<endl;
}
int main(){
test01();
system("pause");
return 0;
}浅拷贝带来的问题是:堆区的内存重复释放,浅拷贝的问题要利用深拷贝进行解决
**总结:**如果属性在堆区开辟的,一定要自己提供拷贝函数,防止浅拷贝带来的问题
this指针:
- this 是 C++中的一个关键字, 也是一个 const 指针,它指向当前对象,通过它可以访问当前对象的所有成员
 - this 只能在成员函数内部使用,用在其他地方没有意义,也是非法的
 - 记住一句话:谁调用我,我就是谁