C++ 构造函数和析构函数

1. 构造函数

定义:每个类都分别定义了它的对象被初始化的方式,类通过一个或者几个特殊的成员函数来控制其对象的初始化过程,这些函数叫做构造函数。构造函数的任务是初始化类对象的数据成员,只要类的对象被创建,就会执行构造函数。

  1. 构造函数的名字和类名相同。
  2. 和其他函数不一样的是,构造函数没有返回类型。
  3. 类可以含有多个构造函数。
  4. 不同于其他成员函数,构造函数不能被声明为const的。当我们创建类的一个const对象时,直到构造函数完成初始化过程,对象才能真正取得其“常量”属性。

合成的默认构造函数

类通过一个特殊的构造函数来控制默认初始化过程,这个函数叫做默认构造函数。默认构造函数无需任何实参。
编译器创建的默认构造函数将按照如下规则初始化类的数据成员:

  1. 如果存在类内的初始值,用它来初始化成员。
  2. 否则,默认初始化该成员。

2. 析构函数

定义:析构函数也是一个特殊的成员函数,没有返回值,不需要程序员显式调用,而是在销毁对象时自动执行。构造函数的名字和类名相同,而析构函数的名字是在类名前面加一个~符合。

Note:析构函数没有参数,不能被重载,因此一个类只能有一个析构函数。如果用户没有定义,编译器会自动生成一个默认的析构函数。

析构函数的执行时机

  1. 在所有函数之外创建的对象是全局对象,它和全局变量类似,位于内存分区中的全局数据区,程序在结束执行时会调用这些对象的析构函数。
  2. 在函数内部创建的对象是局部对象,它和局部变量类似,位于栈区,函数执行结束时会调用这些对象的析构函数。
  3. new创建的对象位于堆区,通过delete删除时才会调用析构函数;如果没有delete,析构函数就不会被执行。
#include<iostream>
#include<string>
using namespace std;

class demo
{
public:
    demo(string s);
    ~demo();
private:
    string m_s;
};
demo::demo(string s):m_s(s){}
demo::~demo(){cout << m_s << endl;}

void func()
{
    //局部对象
    demo obj1("1");
}
//全局对象
demo obj2("2");

int main()
{
    //局部对象
    demo obj3("3");
    //new创建的对象
    demo *pobj4 = new demo("4");
    func();
    cout << "main" << endl;
    return 0;
}
原文地址:https://www.cnblogs.com/xiaobaizzz/p/12169389.html