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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM