日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++总结笔记(五)——构造函数和析构函数

發布時間:2023/12/10 c/c++ 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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. 淺拷貝和深拷貝

深拷貝:在堆區開辟空間,完成拷貝。
淺拷貝:簡單賦值拷貝的方式就屬于淺拷貝,比如默認的拷貝構造函數。

class Cat { public:Cat(){cout << "喵是無參構造函數" << endl;}//Cat(string name)//{// Name = name;// cout << "喵是普通有參構造函數" << endl;//}Cat(string name, int age){Name = name;Age = new int(age);cout << "喵是普通有參構造函數" << endl;}Cat(const Cat &c){Name = c.Name;//深拷貝,用new將傳入Age的地址解引用然后在堆區重新創建一個空間,與cat3所指向的新內存空間就不一樣了,不會發生析構函數重復釋放報錯的問題。Age = new int(*c.Age);cout<< "喵是拷貝構造函數" << endl;}~Cat(){if (Age != NULL){delete Age;Age = NULL;}cout << "喵是析構函數" << endl;}string Name;//咪咪名字int *Age;//咪咪年齡 };void FindName() {淺拷貝,僅發生值傳遞//Cat cat1("小300");//Cat cat2(cat1);////cout << "第一個貓的名字是:" << cat1.Name << endl;//cout << "第二個貓的名字是:" << cat2.Name << endl;//深拷貝,用new在內存中開辟新空間Cat cat3("小300",2);Cat cat4(cat3);cout << "第三個貓的名字是:" << cat3.Name << endl;cout << "第三個貓的年齡是:" << *cat3.Age << endl;cout << "第四個貓的名字是:" << cat4.Name << endl;cout << "第四個貓的年齡是:" << *cat4.Age << endl; }int main() {FindName(); } 喵是普通有參構造函數 喵是拷貝構造函數 第三個貓的名字是:小300 第三個貓的年齡是:2 第四個貓的名字是:小300 第四個貓的年齡是:2 喵是析構函數 喵是析構函數

總結

以上是生活随笔為你收集整理的C++总结笔记(五)——构造函数和析构函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。