總結C++構造函數、拷貝構造和析構函數的相關注意點。
構造函數分類
- 按照類型分類
普通構造
拷貝構造
- 按照參數分類
有參構造
無參構造
構造函數調用
默認構造調用
注意點: 不能用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;
}
運行結果
有參數構造
拷貝構造
析構函數
析構函數
最後留一個思考:拷貝構造如果不加&會怎麼樣?