MichaelBlog

double i = Double.MAX_VALUE; while(i == i + 1){ System.out.print ("学无止境");};

导航

C++: 对象的初始化和清理(构造函数与析构函数)

对象的初始化和清理(构造函数与析构函数)

构造函数:用于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用
析构函数:用于对象销毁系统自动调用,执行一些销毁清理释放内存的操作。

构造函数语法:类名(){}

  1. 没有返回值也不写void
  2. 函数名称与类名相同
  3. 构造函数可以有参数,因此可以重载。
  4. 程序在调用对象的时候会自动调用构造函数,并且只调用一次。

析构函数语法: ~类名(){}

  1. 没有返回值也不写void
  2. 函数名称与类名称相同加~
  3. 析构函数不可以有参数,因此不可以发生重载。
  4. 程序在对象销毁前会自动调用析构函数,无需手动调用而且只调用一次。
#include <iostream>
using namespace std;

class Person{
public:
    Person( ) 
    {
        cout << "构造函数执行" << endl;
    }
    //对象销毁时会自动调用
    ~Person() {
        cout << "析构函数执行" << endl;
    }
};

void test() {
    Person p;
}
int main(){

    test();

    system("pause");
    return 0;

}

构造方法的几种调用

  1. 括号法
  2. 显示法
  3. 隐式转换法
#include <iostream>
using namespace std;

class Person{
public:
    int age;
    Person( ) //无参构造
    {
        cout << "构造函数执行" << endl;
    }
    Person(int a)//有参构造
    {
        age = a;
        cout << "有参构造" << endl;
    }
    Person(const Person &p)//拷贝构造函数
    {
        cout << "拷贝构造" << endl;
        age = p.age;
        
    }
    //对象销毁时会自动调用
    ~Person() {
        cout << "析构函数执行" << endl;
    }
   
};
//调用
void test() {

  //1.括号法
  //   Person p;
    Person p2(10);
    Person p3(p2);//引用类型拷贝构造
 // 2.显示法
    Person p1;
    Person p4 = Person(10);
    Person p5 = Person(p4);

    Person(10); //匿名对象
    //特点:当执行结束后,系统会立即回收匿名对象。
  
    //不要利用拷贝构造函数 初始化匿名对象
    //Person(P3); 就会等于对象的声明
    
    // 3.隐式转换法
    Person p6 = 10;//等于Person p4 = Person(10);
    //属于有参构造
    Person p7 = p2;
} 
int main(){

    test();
    system("pause");
    return 0;

}

/

拷贝构造函数时机

  1. 使用一个已经创建完毕的对象来初始化一个新对象
  2. 值传递的方式给函数参数传值
  3. 以值方式返回局部对象

构造函数调用规则

  1. 默认构造函数(无参,函数体为空)
  2. 默认析构函数(无参,函数体为空)
  3. 默认拷贝构造函数,对属性进行值拷贝

注意:
🎈如果用户定义有参构造函数,c++不在提供默认无参构造,但是会提供默认拷贝构造。
🎈如果用户定义拷贝构造函数,c++不会再提供其他构造函数。

深拷贝与浅拷贝

深拷贝:在堆区重新申请空间,进行拷贝操作。
浅拷贝:简单的赋值拷贝操作。

#include <iostream>
using namespace std;

class Person {
public:

    int m_Age;
    int* m_Height;

    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 = new int(*p.m_Height);

    }
  ~ Person() {
      //析构代码,将堆区开辟数据做释放操作
      if (m_Height != NULL) {
          delete m_Height;
          m_Height = NULL;
      }
        cout << "Person无参构造函数调用" << endl;
    }

};

void  test01()
{
    Person p1(18,180);
    cout << "p1 age = " <<p1.m_Age<<"p1 height = "<<*p1.m_Height<< endl;

    Person p2(p1);//浅拷贝
    cout << "p2 age = " << p2.m_Age << endl;
}
int main(){
    test01();

    system("pause");
    return 0;

}

posted on 2022-04-16 09:47  Michael_chemic  阅读(54)  评论(0编辑  收藏  举报