C++总结笔记(五)——构造函数和析构函数
生活随笔
收集整理的這篇文章主要介紹了
C++总结笔记(五)——构造函数和析构函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 前言
- 一、基本概念
- 1 構造函數
- 2 析構函數
- 二、示例
- 1. 構造函數和析構函數的簡單使用
- 2. 拷貝構造函數的調用
- 3. 淺拷貝和深拷貝
前言
本文講述了構造函數和析構函數的概念以及對應的示例,以便加深理解。
一、基本概念
1 構造函數
構造函數用于初始化類的對象,可以由程序員自己定義,也可以由編譯器定義(構造函數內為空)。
其特點:
1.沒有返回類型。
2.函數名和類名相同。
3.可以有參數,也可以沒有。
4.可以重載。
5.程序會自動調用。
按照參數分類:
1.無參構造函數
2.有參構造函數(包括拷貝構造函數)
3種構造方法:
1.括號法
2.顯示法
3.隱式轉換法
調用規則:
1.編譯器會給類添加至少三個構造函數:1,默認構造函數;2,析構函數(空);3,拷貝構造函數(值拷貝):如果不寫拷貝構造,編譯器會自動生成一個拷貝構造函數,Name = c.Name;。
2.如果自己寫了有參構造函數,編譯器不會再提供默認構造函數,但還是會提供拷貝構造函數。
3.如果自己寫了拷貝構造函數,編譯器其他兩種構造函數都不會再提供。
2 析構函數
析構函數用于銷毀之前聲明的類對象,系統自動調用,用~+類名聲明。
1.析構函數不可以有參數。
2.析構函數無法重載。
二、示例
1. 構造函數和析構函數的簡單使用
class Cat { public:Cat(){cout << "喵是無參構造函數" << endl;}Cat(string name){Name = name;cout << "喵是有參構造函數" << endl;}//用于拷貝c的屬性值,用常量引用的方式進行Cat(const Cat &c){Name = c.Name;cout<< "喵是拷貝構造函數" << endl;}~Cat(){cout << "喵是析構函數" << endl;}string Name;//咪咪名字 };void FindName() {//括號法Cat cat1;//用默認構造函數時,不能加括號,否則編譯器會當作函數聲明。Cat cat2(cat1);//拷貝構造函數調用Cat cat3("小300");//有參構造函數調用。Cat cat4(cat3);//拷貝構造函數調用cout << "第一個貓的名字是:" << cat1.Name << endl;cout << "第二個貓的名字是:" << cat2.Name << endl;cout << "第三個貓的名字是:" << cat3.Name << endl;cout << "第四個貓的名字是:" << cat4.Name << endl;//顯示法Cat cat5;//默認構造函數Cat cat6 = Cat("三號樓");//有參構造函數調用。Cat cat7 = Cat(cat6);//拷貝構造函數調用Cat("蹭鐵棍");//匿名對象,會直接調用構造函數和析構函數,再去執行后面的內容。//Cat(cat7);不要匿名初始化拷貝構造函數cout << "第五個貓的名字是:" << cat5.Name << endl;cout << "第六個貓的名字是:" << cat6.Name << endl;cout << "第七個貓的名字是:" << cat7.Name << endl;//隱式調用string name8 = "來兩根";Cat cat8 = name8;cout << "第八個貓的名字是:" << cat8.Name << endl; }int main() {FindName(); } 喵是拷貝構造函數 喵是普通有參構造函數 喵是拷貝構造函數 第一個貓的名字是: 第二個貓的名字是: 第三個貓的名字是:小300 第四個貓的名字是:小300 喵是無參構造函數 喵是普通有參構造函數 喵是拷貝構造函數 喵是普通有參構造函數 喵是析構函數 第五個貓的名字是: 第六個貓的名字是:三號樓 第七個貓的名字是:三號樓 喵是普通有參構造函數 第八個貓的名字是:來兩根 喵是析構函數 喵是析構函數 喵是析構函數 喵是析構函數 喵是析構函數 喵是析構函數 喵是析構函數 喵是析構函數2. 拷貝構造函數的調用
void eat1(Cat cat) {cout << cat.Name << "吃貓糧" << endl; }Cat eat2() {Cat cat("炸糊的栗子");cout << cat.Name << "吃骨頭" << endl;return cat; } void FindName() {//使用一個已經創建的對象來初始化新的對象Cat cat1("小300");//有參構造函數調用。Cat cat2(cat1);//拷貝構造函數調用cout << "第一個貓的名字是:" << cat1.Name << endl;cout << "第二個貓的名字是:" << cat2.Name << endl;//值傳遞傳值 Cat cat3("烤糊的栗子");eat1(cat3);cout << "第三個貓的名字是:" << cat3.Name << endl;//值方式返回局部對象Cat cat4 = eat2();cout << "第四個貓的名字是:" << cat4.Name << endl; } 喵是普通有參構造函數 喵是拷貝構造函數 第一個貓的名字是:小300 第二個貓的名字是:小300 喵是普通有參構造函數 喵是拷貝構造函數 烤糊的栗子吃貓糧 喵是析構函數 第三個貓的名字是:烤糊的栗子 喵是普通有參構造函數 炸糊的栗子吃骨頭 喵是拷貝構造函數 喵是析構函數 第四個貓的名字是:炸糊的栗子 喵是析構函數 喵是析構函數 喵是析構函數 喵是析構函數3. 淺拷貝和深拷貝
深拷貝:在堆區開辟空間,完成拷貝。
淺拷貝:簡單賦值拷貝的方式就屬于淺拷貝,比如默認的拷貝構造函數。
總結
以上是生活随笔為你收集整理的C++总结笔记(五)——构造函数和析构函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python小数据池
- 下一篇: C++总结笔记(七)—— 运算符重载