最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++語法詳解之封裝、構(gòu)造函數(shù)、析構(gòu)函數(shù)

 更新時間:2020年03月07日 10:15:51   投稿:mrr  
這篇文章主要介紹了C++語法詳解之封裝、構(gòu)造函數(shù)、析構(gòu)函數(shù)的相關(guān)知識,通過實(shí)例代碼給大家詳細(xì)介紹,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

大家先了解下什么是構(gòu)造函數(shù),什么是析構(gòu)函數(shù),作用是什么?

構(gòu)造函數(shù)(方法)是對象創(chuàng)建完成后第一個被對象自動調(diào)用的方法。它存在于每個聲明的類中,是一個特殊的成員方法。作用是執(zhí)行一些初始化的任務(wù)。Php中使用__construct()聲明構(gòu)造方法,并且只能聲明一個。

析構(gòu)函數(shù)(方法)作用和構(gòu)造方法正好相反,是對象被銷毀之前最后一個被對象自動調(diào)用的方法。是PHP5中新添加的內(nèi)容作用是用于實(shí)現(xiàn)在銷毀一個對象之前執(zhí)行一些特定的操作,諸如關(guān)閉文件和釋放內(nèi)存等。

下面在通過具體例子看下C++語法詳解之封裝、構(gòu)造函數(shù)、析構(gòu)函數(shù)。

成員變量私有化,提供公共的getter和setter給外界去訪問成員變量

class Person {
 int age;
 
public:
 void setAge(int age){
  this->age = age;
 }
 
 int getAge(){
  return this->age;
 }
 
};

int main(){
 Person person;
 person.setAge(10);
 cout << person.getAge() << endl;
}

堆空間

在程序運(yùn)行過程,為了能夠自由控制內(nèi)存的生命周期、大小,會經(jīng)常使用堆空間的內(nèi)存

堆空間的申請\釋放

malloc \ free
new \ delete
new [] \ delete []

注意

  • 申請堆空間成功后,會返回那一段內(nèi)存空間的地址
  • 申請和釋放必須是1對1的關(guān)系,不然可能會存在內(nèi)存泄露

現(xiàn)在的很多高級編程語言不需要開發(fā)人員去管理內(nèi)存(比如Java),屏蔽了很多內(nèi)存細(xì)節(jié),利弊同時存在

  • 利:提高開發(fā)效率,避免內(nèi)存使用不當(dāng)或泄露
  • 弊:不利于開發(fā)人員了解本質(zhì),永遠(yuǎn)停留在API調(diào)用和表層語法糖,對性能優(yōu)化無從下手

例如開盤int類型的空間,使用完之后銷毀

int *p = (int *)malloc(sizeof(int));
 *p = 10;
 free(p);
 
 int *p2 = new int;
 *p2 = 20;
 delete p2;
 
 int *p3 = new int[3];
 *p = 10;
 *(p+1) = 20;
 *(p+2) = 30;
 delete [] (p3);

堆空間的初始化

memset

memset 函數(shù)是將較大的數(shù)據(jù)結(jié)構(gòu)(比如對象、數(shù)組等)內(nèi)存清零的比較快的方法

如下所示

 Person person;
 person.age = 10;
 person.height = 199;
 //從person的地址開始,每個字節(jié)都賦值為0
memset(&person, 0, sizeof(person));

初始化

int *p1 = (int *)malloc(sizeof(int)); //*p1 未初始化
int *p2 = (int *)malloc(sizeof(int));
memset(p2, 0, sizeof(int));//將 *p2 的每一個字節(jié)都初始化為0

如下幾種方式

int *p1 = new int;   //未初始化
int *p2 = new int();   //被初始化為0
int *p3 = new int(5);  //被初始化為5
int *p4 = new int[3];  //數(shù)組元素未被初始化
int *p5 = new int[3]();  //3個數(shù)組元素都被初始化0
int *p6 = new int[3]{};  //3個數(shù)組元素都被初始化0
int *p7 = new int[3]{5};  //數(shù)組首元素被初始化為5,其他元素被初始化為0

構(gòu)造函數(shù)(Constructor)

構(gòu)造函數(shù)(也叫構(gòu)造器),在對象創(chuàng)建的時候自動調(diào)用,一般用于完成對象的初始化工作

特點(diǎn)

  • 函數(shù)名與類同名,無返回值(void都不能寫),可以有參數(shù),可以重載,可以有多個構(gòu)造函數(shù)
  • 一旦自定義了構(gòu)造函數(shù),必須用其中一個自定義的構(gòu)造函數(shù)來初始化對象

注意

通過malloc分配的對象不會調(diào)用構(gòu)造函數(shù)
一個廣為流傳的、很多教程\書籍都推崇的錯誤結(jié)論:
默認(rèn)情況下,編譯器會為每一個類生成空的無參的構(gòu)造函數(shù)
正確理解:在某些特定的情況下,編譯器才會為類生成空的無參的構(gòu)造函數(shù)
比如我們自己寫2個構(gòu)造函數(shù)

class Person{
public:
 int age;
 
 Person(){
  cout << "Person()" << endl;
 }
 
 Person(int age){
   cout << "Person(int age))" << endl;
 }
};

在不同的空間調(diào)用的時候,如下區(qū)別

// 全局區(qū)
Person p1;  //調(diào)用Person()
Person p2(); //這是一個函數(shù),函數(shù)名是p2,返回值類型是Person,無參
Person p3(18); //調(diào)用 Person(int)

int main(){
 //??臻g
 Person p4;  //調(diào)用Person()
 Person p5(); //這是一個函數(shù),函數(shù)名是p5,返回值類型是Person,無參
 Person p6(18); //調(diào)用 Person(int)
 
 
 //堆空間
 Person *p7 = new Person;  //調(diào)用Person()
 Person *p8 = new Person(); //調(diào)用Person()
 Person *p9 = new Person(20); //調(diào)用 Person(int)
}

析構(gòu)函數(shù)

析構(gòu)函數(shù)(也叫析構(gòu)器),在對象銷毀的時候自動調(diào)用,一般用于完成對象的清理工作

特點(diǎn)

函數(shù)名以~開頭,與類同名,無返回值(void都不能寫),無參,不可以重載,有且只有一個析構(gòu)函數(shù)

注意

  • 通過malloc分配的對象free的時候不會調(diào)用析構(gòu)函數(shù)
  • 構(gòu)造函數(shù)、析構(gòu)函數(shù)要聲明為public,才能被外界正常使用

例如下面的代碼

class Cat{
public:
 int age;
 Cat(){
  cout << "Cat()" << endl;
 }
 
 ~Cat(){
  cout << "~Cat()" << endl;
 }
};


class Person{
public:
 int age;
 Cat *cat;
 Person(){
  this->cat = new Cat();
  cout << "Person()" << endl;
 }
 
 ~Person(){
  cout << "~Person()" << endl;
 }
};

int main(){
 {
  Person person;
 }
 return 0;
}

輸出

Cat()
Person()
~Person()

當(dāng)person銷毀的時候,其持有的cat并沒有銷毀。

原因

當(dāng)person銷毀的時候,其指向cat對象的指針銷毀了,但是堆空間的cat對象依然存在,就會有內(nèi)存泄露。所以需要在析構(gòu)函數(shù)里面來釋放掉。類似的析構(gòu)函數(shù)在許多其他語言底層也是應(yīng)用廣泛,例如Objective-C的源碼中,大量使用析構(gòu)函數(shù)。

代碼改成如下所示:

~Person(){
  delete cat;
  cout << "~Person()" << endl;
 }

輸出

Cat()
Person()
~Cat()
~Person()

可知,cat對象才真正銷毀。

總結(jié)

到此這篇關(guān)于C++語法詳解之封裝、構(gòu)造函數(shù)、析構(gòu)函數(shù)的文章就介紹到這了,更多相關(guān)c++ 封裝構(gòu)造函數(shù)析構(gòu)函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt如何通過pos()獲取坐標(biāo)信息

    Qt如何通過pos()獲取坐標(biāo)信息

    這篇文章主要給大家介紹了關(guān)于Qt如何通過pos()獲取坐標(biāo)信息的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用qt具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • Visual Studio 2022無法打開源文件的解決方式

    Visual Studio 2022無法打開源文件的解決方式

    這篇文章主要介紹了Visual Studio 2022無法打開源文件的解決方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 數(shù)據(jù)結(jié)構(gòu)順序表操作示例

    數(shù)據(jù)結(jié)構(gòu)順序表操作示例

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)順序表操作示例,其中有在第I個元素前插入數(shù)據(jù)x,元素從0開始計(jì)數(shù)、刪除第i個元素,元素從0開始計(jì)數(shù)的方法,需要的朋友可以參考下
    2014-03-03
  • C++11 線程同步接口std::condition_variable和std::future的簡單使用示例詳解

    C++11 線程同步接口std::condition_variable和std::future的簡單使用示例詳

    本文介紹了std::condition_variable和std::future在C++中的應(yīng)用,用于線程間的同步和異步執(zhí)行,通過示例代碼,展示了如何使用std::condition_variable的wait和notify接口進(jìn)行線程間同步
    2024-09-09
  • C語言函數(shù)的遞歸調(diào)用詳情

    C語言函數(shù)的遞歸調(diào)用詳情

    這篇文章主要介紹了C語言函數(shù)的遞歸調(diào)用詳情,遞歸做為一種算法在程序設(shè)計(jì)語言中廣泛應(yīng)用,主要的思考方式就是大事化小,下文具體的相關(guān)介紹,需要的小伙伴可以參考一下
    2022-04-04
  • c++傳輸文件到不同計(jì)算機(jī)上的示例代碼

    c++傳輸文件到不同計(jì)算機(jī)上的示例代碼

    這篇文章主要為大家詳細(xì)介紹了c++傳輸文件到不同計(jì)算機(jī)上的相關(guān)知識,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Qt利用QChart實(shí)現(xiàn)實(shí)時波形圖的繪制

    Qt利用QChart實(shí)現(xiàn)實(shí)時波形圖的繪制

    這篇文章主要介紹了Qt如何利用QChart實(shí)現(xiàn)實(shí)時波形圖的繪制,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)有一定是參考價(jià)值,需要的可以參考一下
    2022-06-06
  • c++判斷是否為目錄的示例分享

    c++判斷是否為目錄的示例分享

    這篇文章主要介紹了c++判斷是否為目錄的示例,需要的朋友可以參考下
    2014-03-03
  • C 語言基礎(chǔ)之初識 C 語言常量

    C 語言基礎(chǔ)之初識 C 語言常量

    C語言中的常量分為以下幾種:字面常量、const修飾的常變量、#define定義的標(biāo)識符常量等,下面我們將詳細(xì)對C語言這幾個常量做介紹,感興趣的小伙伴可以參考一下
    2021-09-09
  • C++訪問注冊表獲取已安裝軟件信息列表示例代碼

    C++訪問注冊表獲取已安裝軟件信息列表示例代碼

    這篇文章主要介紹了c++通過讀取注冊表獲得本機(jī)已安裝軟件信息的方法,大家參考使用吧
    2013-11-11

最新評論

沙湾县| 正镶白旗| 合水县| 江源县| 开鲁县| 桃江县| 沛县| 股票| 西贡区| 田东县| 中西区| 呼伦贝尔市| 黄平县| 盘锦市| 崇义县| 肥乡县| 三门县| 贺州市| 长子县| 遂宁市| 夹江县| 商都县| 项城市| 云和县| 青冈县| 图木舒克市| 利辛县| 库车县| 靖州| 尼玛县| 榕江县| 仙桃市| 如东县| 富宁县| 高唐县| 山东省| 慈溪市| 永顺县| 吉木乃县| 浑源县| 景德镇市|