C++中構(gòu)造函數(shù)與析構(gòu)函數(shù)的詳解及其作用介紹
構(gòu)造函數(shù)
構(gòu)造函數(shù) (constructor) 是一種特殊的成員函數(shù). 它會(huì)在每次創(chuàng)建類的新對(duì)象時(shí)執(zhí)行. 構(gòu)造函數(shù)的名稱與類的名稱是完全相同的, 并且不會(huì)返回任何類型. 構(gòu)造函數(shù)可用于為某些成員變量設(shè)置初始值.
格式:
Class::Class(); // 構(gòu)造函數(shù)
默認(rèn)構(gòu)造函數(shù)
如果用戶自己沒有定義構(gòu)造函數(shù), C++ 系統(tǒng)會(huì)自動(dòng)生成一個(gè)默認(rèn)構(gòu)造函數(shù). 這個(gè)構(gòu)造函數(shù)體是空的, 沒有參數(shù), 不執(zhí)行初始化操作.
例如:
Time.h:
class Time { private: int hour; int minute; int second; public: Time(); // 默認(rèn)構(gòu)造函數(shù) void set_time(int h, int m, int s); void show_time(); };
Time.cpp:
#include "Time.h" #include <iostream> using namespace std; Time::Time() { hour = 0; minute = 0; second = 0; } void Time::set_time(int h, int m, int s) { hour = h; minute = m; second = s; } void Time::show_time() { cout << hour << ":" << minute << ":" << second << endl; }
main:
#include "Time.h" #include <iostream> using namespace std; int main() { Time time1; // 實(shí)例化time time1.show_time(); // 調(diào)用show_time return 0; }
輸出結(jié)果:
0:0:0
重點(diǎn):
- 即使提供了其他構(gòu)造函數(shù), 提供一個(gè)默認(rèn)構(gòu)造函數(shù)幾乎總是對(duì)的
- 通常在默認(rèn)構(gòu)造函數(shù)中, 給成員提供的初始值應(yīng)該指出該對(duì)象是 “空” 的
有參構(gòu)造函數(shù)
構(gòu)造函數(shù)中參數(shù)可以指定默認(rèn)值. 如果童虎不指定實(shí)參指, 編譯西永就使形參取默認(rèn)值.
例如:
Time 類:
#ifndef PROJECT1_TIME_H #define PROJECT1_TIME_H class Time { private: int hour; int minute; int second; public: Time(); // 默認(rèn)構(gòu)造函數(shù) Time(int h, int m=0, int s=0); // 有參構(gòu)造函數(shù) void show_time(); }; #endif //PROJECT1_TIME_H
Time.cpp:
#include "Time.h" #include <iostream> using namespace std; // 默認(rèn)構(gòu)造函數(shù) Time::Time() : hour(0), minute(0), second(0) {} // 有參構(gòu)造函數(shù) Time::Time(int h, int m, int s) : hour(h), minute(m), second(s) {} void Time::show_time() { cout << hour << ":" << minute << ":" << second << endl; }
main:
#include "Time.h" #include <iostream> using namespace std; int main() { Time time1; time1.show_time(); Time time2(8); time2.show_time(); Time time3(8, 8); time3.show_time(); Time time4(8, 8, 8); time4.show_time(); return 0; }
輸出結(jié)果:
0:0:0
8:0:0
8:8:0
8:8:8
析構(gòu)函數(shù)
析構(gòu)函數(shù) (destructor) 也是一個(gè)特殊的成員函數(shù). 當(dāng)對(duì)象的生命期結(jié)束時(shí), 會(huì)自動(dòng)執(zhí)行析構(gòu)函數(shù). 析構(gòu)函數(shù)的名字是類名前面加一個(gè) “~” 符號(hào).
格式:
Class::~Class(); // 析構(gòu)函數(shù)
析構(gòu)函數(shù)的作用在撤銷對(duì)象占用的內(nèi)存之前完成一些清理 & 善后的工作.
析構(gòu)函數(shù)例子
Student 類:
#ifndef PROJECT1_STUDENT_H #define PROJECT1_STUDENT_H #include <string> using namespace std; class Student { private: int num; string name; char gender; public: Student(); Student(int num, string name, char gender); ~Student(); void display(); }; #endif //PROJECT1_STUDENT_H
Student.cpp:
#include "Student.h" #include <iostream> using namespace std; // 無參構(gòu)造 Student::Student() : num(-1), name("None"), gender('N') {} Student::Student(int n, string p, char g) : num(n), name(p), gender(g) { cout << "執(zhí)行構(gòu)造函數(shù): " << "Welcome, " << name << endl; } void Student::display() { cout << "num: " << num << endl; cout << "name: " << name << endl; cout << "gender: " << gender << endl; cout << "===============" << endl; } Student::~Student() { cout << "執(zhí)行析構(gòu)函數(shù): " << "Bye bye, " << name << endl; }
main:
#include "Student.h" #include <iostream> using namespace std; int main() { Student student1(1, "Little white", 'f'); Student student2(2, "Big white", 'f'); student1.display(); student2.display(); return 0; }
輸出結(jié)果:
執(zhí)行構(gòu)造函數(shù): Welcome, Little white
執(zhí)行構(gòu)造函數(shù): Welcome, Big white
num: 1
name: Little white
gender: f
===============
num: 2
name: Big white
gender: f
===============
執(zhí)行析構(gòu)函數(shù): Bye bye, Big white
執(zhí)行析構(gòu)函數(shù): Bye bye, Little white
析構(gòu)函數(shù)執(zhí)行時(shí)機(jī)
對(duì)于函數(shù)中定義的自動(dòng)局部對(duì)象, 當(dāng)函數(shù)被調(diào)用結(jié)束時(shí), 對(duì)象釋放. 在對(duì)象釋放前自自動(dòng)執(zhí)行析構(gòu)函數(shù).
局部對(duì)象
static 局部對(duì)象只在 main 函數(shù)結(jié)束或調(diào)用 exit 函數(shù)結(jié)束程序時(shí), 調(diào)用 static 局部對(duì)象的洗后函數(shù).
全局對(duì)象
對(duì)于全局對(duì)象, 在程序的流程離開其作用域時(shí) (如 main 函數(shù)結(jié)束或調(diào)用 exit 函數(shù)) 時(shí), 調(diào)用該全局對(duì)象的析構(gòu)函數(shù).
到此這篇關(guān)于C++中構(gòu)造函數(shù)與析構(gòu)函數(shù)的詳解及其作用介紹的文章就介紹到這了,更多相關(guān)C++ 構(gòu)造函數(shù) 析構(gòu)函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++超詳細(xì)講解構(gòu)造函數(shù)與析構(gòu)函數(shù)的用法及實(shí)現(xiàn)
- C++深入講解對(duì)象的銷毀之析構(gòu)函數(shù)
- 詳解C++中虛析構(gòu)函數(shù)的作用及其原理分析
- 詳解C++ 編寫String 的構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、析構(gòu)函數(shù)和賦值函數(shù)
- C++中構(gòu)造函數(shù)與析構(gòu)函數(shù)的調(diào)用順序詳解
- 淺談C++基類的析構(gòu)函數(shù)為虛函數(shù)
- C++類成員構(gòu)造函數(shù)和析構(gòu)函數(shù)順序示例詳細(xì)講解
- C++ 私有析構(gòu)函數(shù)的作用示例詳解
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(32.最長(zhǎng)有效括號(hào))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(32.最長(zhǎng)有效括號(hào)),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07VS2022+libtorch+Cuda11.3安裝測(cè)試教程詳解(調(diào)用cuda)
這篇文章主要介紹了VS2022+libtorch+Cuda11.3安裝測(cè)試(調(diào)用cuda),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05C語言的隨機(jī)數(shù)rand()函數(shù)詳解
這篇文章主要為大家詳細(xì)介紹了C語言的隨機(jī)數(shù)rand()函數(shù),使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02C++ 中"priority_queue" 優(yōu)先級(jí)隊(duì)列實(shí)例詳解
這篇文章主要介紹了C++ 中"priority_queue" 優(yōu)先級(jí)隊(duì)列實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04VC實(shí)現(xiàn)的病毒專殺工具完整實(shí)例
這篇文章主要介紹了VC實(shí)現(xiàn)的病毒專殺工具完整實(shí)例,詳細(xì)講述了針對(duì)病毒的進(jìn)程終止、刪除文件及回復(fù)注冊(cè)表與啟動(dòng)項(xiàng)等,同時(shí)介紹了與之相關(guān)的系統(tǒng)函數(shù),非常具有參考借鑒價(jià)值,需要的朋友可以參考下2014-10-10