C++中類的構造函數和析構函數(一)

總結C++構造函數、拷貝構造和析構函數的相關注意點。

構造函數分類
  1. 按照類型分類
    普通構造
    在這裏插入圖片描述
    拷貝構造
    在這裏插入圖片描述
  2. 按照參數分類
    有參構造
    在這裏插入圖片描述
    無參構造
    在這裏插入圖片描述
構造函數調用
默認構造調用

在這裏插入圖片描述
注意點: 不能用Person p();調用默認構造函數,原因是編譯器以爲這是個函數的聲明。如下圖,調用後並未打印任何日誌,編譯器認爲這是個函數聲明。
在這裏插入圖片描述

括號法調用

在這裏插入圖片描述

顯示法調用

在這裏插入圖片描述

隱式法調用

在這裏插入圖片描述
如果使用以下方式調用呢?

Person(10);

以上調用稱爲匿名調用,在程序執行完這句後,就直接回收資源,釋放對象了。

Person p1(10);
Person(p1);

不可以調用拷貝構造函數初始化匿名對象,編譯器認爲代碼爲Person p1;出現重複對象,如下圖
在這裏插入圖片描述

構造函數和析構函數調用順序
  • 調用默認構造
#include<iostream>
using namespace std;

class Person
{
public:

	Person()
	{
		cout << "默認構造" << endl;
	}

	
	~Person()
	{
		cout << "析構函數" << endl;
	}

private:
	int m_age;
};

void Test1()
{
	Person p;
}

int main()
{
	Test1();
	return 0;
}

運行結果

默認構造
析構函數 .
  • 調用有參構造
#include<iostream>
using namespace std;

class Person
{
public:

   Person()
   {
   	cout << "默認構造" << endl;
   }

   Person(const int age)
   {
   	this->m_age = age;
   	cout << "有參構造" << endl;
   }

   ~Person()
   {
   	cout << "析構函數" << endl;
   }

private:
   int m_age;
};

void Test1()
{
   Person p(10);
}

int main()
{
   Test1();
   return 0;
}

運行結果

有參構造
析構函數
  • 調用拷貝構造
#include<iostream>
using namespace std;

class Person
{
public:

   Person()
   {
   	cout << "默認構造" << endl;
   }

   Person(const int age)
   {
   	this->m_age = age;
   	cout << "有參數構造" << endl;
   }
 
   Person(const Person& p)
   {
   	this->m_age = p.m_age;
   	cout << "拷貝構造" << endl;
   }

   ~Person()
   {
   	cout << "析構函數" << endl;
   }

private:
   int m_age;
};

void Test1()
{
   Person p(10);
   Person p1(p);
}

int main()
{
   Test1(); 
   return 0;
}

運行結果

有參數構造
拷貝構造
析構函數
析構函數

最後留一個思考:拷貝構造如果不加&會怎麼樣?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章