对象特性--构造函数调用规则
生活随笔
收集整理的這篇文章主要介紹了
对象特性--构造函数调用规则
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
默認情況下,C++編譯器至少給一個類添加3個函數:
1.默認構造函數(無參,函數體為空)
2.默認析構函數(無參,函數體為空)
3.默認拷貝構造函數,對屬性進行值拷貝
1、創建一個類,C++編譯器會給每個類都添加至少3個函數
#include<iostream>
using namespace std;//構造函數的調用規則
//1、創建一個類,C++編譯器會給每個類都添加至少3個函數
// 默認構造(空實現)
//析構函數(空實現)
//拷貝構造(值拷貝)I
class Person
{
public:Person(){cout << "Person無參構造函數的調用" << endl;}Person(int age){cout << "Person有參構造函數的調用" << endl;m_Age = age;}/*Person(const Person& p) //這塊拷貝構造函數是被注釋掉的 但是輸出結果的話 看下圖{cout << "Person拷貝構造函數的調用" << endl;m_Age = p.m_Age;}*/~Person(){cout << "Person析構函數的調用" << endl;}int m_Age;
};void test01()
{Person p;p.m_Age = 18;Person p1(p);cout << "p2的年齡是: " << p1.m_Age << endl;
}int main()
{test01();system("pause");return 0;
}
運行結果如下:
相當于就是編譯器給類中自動填補了一個拷貝函數
2.如果在僅僅類中寫了有參構造函數,那么編譯器就不會再提供默認構造函數,依然提供拷貝構造函數
#include<iostream>
using namespace std;class Person
{
public:Person(int age) //有參構造函數{cout << "Person有參構造函數的調用" << endl;m_Age = age;}~Person() //析構函數{cout << "Person析構函數的調用" << endl;}int m_Age;
};void test02()
{Person p;}int main()
{test02();system("pause");return 0;
}
上述代碼僅有有參構造和析構函數,調試:
?會發現沒有默認構造函數,印證了上述規則
將上述test02中的代碼更換為如下:
void test02()
{Person p(18);Person p2(p);cout << p2.m_Age << endl;}
執行:::
?會發現類中沒有拷貝構造函數,但是運行依然OK
規則:如果在僅僅類中寫了有參構造函數,那么編譯器就不會再提供默認構造函數,依然提供拷貝構造函數
3.如果我們寫了拷貝構造函數,編譯器將不會早為我們提供普通構造函數(默認構造和有參構造)
class Person
{
public://該類中現在只有拷貝構造和析構Person(const Person & p){cout << "Person有參構造函數的調用" << endl;}~Person(){cout << "Person析構函數的調用" << endl;}int m_Age;
};void test02()
{Person p(18);Person p1;}
調試會報錯如下:
?會報錯顯示為沒有默認構造函數和有參構造函數
總結一下:每個類中都會有三種函數
1.如果在僅僅類中寫了有參構造函數,那么編譯器就不會再提供默認構造函數,依然提供拷貝構造函數
2.如果我們寫了拷貝構造函數,編譯器將不會早為我們提供普通構造函數(默認構造和有參構造)
下篇,構造析構函數完結篇---->深拷貝與淺拷貝
《千與千尋》中有句臺詞我特別喜歡:何時看見都告訴自己:要加油。小千在面對突如其來的改變,選擇的是勇敢,還有那份執著。
總結
以上是生活随笔為你收集整理的对象特性--构造函数调用规则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有没有人天生感情比较淡,和人有距离感 ,
- 下一篇: 对象特性---->深拷贝与浅拷贝