C++ - 封装和拷贝

封装:

  1. 封装是C++面向对象三大特性之一

  2. 封装的意义:

    • 将属性和行为作为一个整体,表现生活中的事物
    • 将属性和行为加以权限控制
  3. 封装意义一:

    1. 在设计类的时候,属性和行为写在一起,表现事物
    2. **语法:**class 类名{访问权限: 属性/行为};
    3. 注意:
      • 属性和行为统称为成员
      • 属性又称为成员属性
      • 行为又称为成员函数、成员方法
  4. 封装意义二:

    1. 类在设计时,可以把属性和行为放在不同的权限下,加以控制

浅拷贝:

  1. 同一类型的对象之间可以赋值,使得两个对象的成员变量的值相同,两个对象仍然是独立的两个对象,这种情况被称为浅拷贝。

  2. 一般情况下,浅拷贝没有任何副作用,但是当类中有指针,并且指针指向动态分配的内存空间,析构函数做了动态内存释放的处理,会导致内存问题。

    浅拷贝

深拷贝:

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

    深拷贝

    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
    46
    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)
    {
    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指针:

  1. this 是 C++中的一个关键字, 也是一个 const 指针,它指向当前对象,通过它可以访问当前对象的所有成员
  2. this 只能在成员函数内部使用,用在其他地方没有意义,也是非法的
  3. 记住一句话:谁调用我,我就是谁

参考链接: