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

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

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

构造函数:用于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用



析构函数:用于对象销毁系统自动调用,执行一些销毁清理释放内存的 *** 作。


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

  1. 没有返回值也不写void


  2. 函数名称与类名相同


  3. 构造函数可以有参数,因此可以重载。


  4. 程序在调用对象的时候会自动调用构造函数,并且只调用一次。


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

  1. 没有返回值也不写void


  2. 函数名称与类名称相同加~


  3. 析构函数不可以有参数,因此不可以发生重载。


  4. 程序在对象销毁前会自动调用析构函数,无需手动调用而且只调用一次。


#include 
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 
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 
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;

}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/565083.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-06
下一篇 2022-04-06

发表评论

登录后才能评论

评论列表(0条)

保存