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

C++構(gòu)造函數(shù)的一些注意事項(xiàng)總結(jié)

 更新時(shí)間:2021年11月01日 14:47:21   作者:學(xué)渣的C/C++  
構(gòu)造函數(shù)是創(chuàng)建類(lèi)對(duì)象,并且在創(chuàng)建完成前,對(duì)類(lèi)進(jìn)行初始化的特殊函數(shù),下面這篇文章主要給大家介紹了關(guān)于C++構(gòu)造函數(shù)的一些注意事項(xiàng),需要的朋友可以參考下

1、匿名對(duì)象

首先應(yīng)該明確匿名對(duì)象,匿名對(duì)象是之沒(méi)有對(duì)象名,調(diào)用完構(gòu)造函數(shù)后即析構(gòu)的對(duì)象。下面通過(guò)代碼捕捉類(lèi)的構(gòu)造函數(shù)和析構(gòu)函數(shù),以進(jìn)行說(shuō)明:

#include <iostream>
using namespace std;

class Solution{
public:
    Solution(int a, int b):m_num1(a), m_num2(b) {
        cout << "有參構(gòu)造函數(shù)的調(diào)用" << endl;
    };
    Solution(const Solution& s):m_num1(s.m_num1), m_num2(s.m_num2){
        cout << "拷貝構(gòu)造函數(shù)的調(diào)用" << endl;
    } 
    ~Solution(){
        cout << "析構(gòu)函數(shù)的調(diào)用" << endl;
    }
private:
    int m_num1;
    int m_num2;
};

int main()
{
    Solution(8,9); // Solution(8,9) 匿名對(duì)象
    
    system("pause");
    return 0;
}

代碼運(yùn)行結(jié)果為:

通過(guò)代碼運(yùn)行結(jié)果可以看到,創(chuàng)建匿名對(duì)象的時(shí)候,調(diào)用了類(lèi)的構(gòu)造函數(shù),隨后立即調(diào)用了析構(gòu)函數(shù)。我們可以直接利用匿名對(duì)象進(jìn)行初始化類(lèi)的成員的初始化,代碼如下:

#include <iostream>
using namespace std;

class Solution{
public:
    Solution(int a, int b):m_num1(a), m_num2(b) {
        cout << "有參構(gòu)造函數(shù)的調(diào)用" << endl;
    };
    Solution(const Solution& s):m_num1(s.m_num1), m_num2(s.m_num2){
        cout << "拷貝構(gòu)造函數(shù)的調(diào)用" << endl;
    } 
    ~Solution(){
        cout << "析構(gòu)函數(shù)的調(diào)用" << endl;
    }

    int m_num1;
    int m_num2;
};

int main()
{
    Solution s1(Solution(8,9));
    // Solution s1 = Solution(8,9); //顯式 Solution(8,9) 匿名對(duì)象初始化類(lèi)成員
    // Solution s1 = {8,9};        //{8,9}等價(jià)于Solution(8,9)
    cout << "s1.m_num1 = " << s1.m_num1 << endl;
    cout << "s1.m_num2 = " << s1.m_num2 << endl;   
    system("pause");
    return 0;
}

運(yùn)行結(jié)果如下:

代碼調(diào)用了一次構(gòu)造函數(shù),可見(jiàn)匿名對(duì)象可以初始化類(lèi)成員,就是將匿名對(duì)象轉(zhuǎn)化成了s1對(duì)象,這里需要與拷貝構(gòu)造函數(shù)區(qū)分開(kāi):

#include <iostream>
using namespace std;

class Solution{
public:
    Solution(int a, int b):m_num1(a), m_num2(b) {
        cout << "有參構(gòu)造函數(shù)的調(diào)用" << endl;
    };
    Solution(const Solution& s):m_num1(s.m_num1), m_num2(s.m_num2){
        cout << "拷貝構(gòu)造函數(shù)的調(diào)用" << endl;
    } 
    ~Solution(){
        cout << "析構(gòu)函數(shù)的調(diào)用" << endl;
    }

    int m_num1;
    int m_num2;
};

int main()
{
    Solution s1(10,11);
    Solution s2(s1);
    cout << "s2.m_num1 = " << s2.m_num1 << endl;
    cout << "s2.m_num2 = " << s2.m_num2 << endl;
    system("pause");
    return 0;
}

代碼運(yùn)行結(jié)果為:

對(duì)比以上兩個(gè)代碼可以發(fā)現(xiàn),通過(guò)匿名對(duì)象初始化類(lèi)成員并不是拷貝構(gòu)造,只是一種替換,通過(guò)匿名對(duì)象初始化類(lèi)成員并不會(huì)調(diào)用拷貝構(gòu)造函數(shù)。

2、拷貝構(gòu)造函數(shù)的調(diào)用時(shí)機(jī)

今年秋招筆試題最?lèi)?ài)考查構(gòu)造函數(shù)的調(diào)用時(shí)機(jī),通常會(huì)結(jié)合繼承和多態(tài)來(lái)考察,這里先說(shuō)明一下拷貝構(gòu)造函數(shù)的調(diào)用時(shí)機(jī),后面再詳細(xì)說(shuō)明帶繼承和多態(tài)的構(gòu)造函數(shù)調(diào)用時(shí)機(jī)。

一、使用一個(gè)已經(jīng)創(chuàng)建的對(duì)象來(lái)初始化一個(gè)新對(duì)象,如上面的代碼,創(chuàng)建對(duì)象s1的時(shí)候調(diào)用了有參構(gòu)造函數(shù),通過(guò)s1來(lái)初始化s2的時(shí)候調(diào)用了拷貝構(gòu)造。

二、函數(shù)的參數(shù)是需要值傳遞的對(duì)象的時(shí)候

三、函數(shù)返回對(duì)象的時(shí)候

下面通過(guò)代碼驗(yàn)證,當(dāng)函數(shù)的參數(shù)是一個(gè)需要值傳遞的對(duì)象的情況:

#include <iostream>
using namespace std;

class Solution{
public:
    Solution(int a, int b):m_num1(a), m_num2(b) {
        cout << "有參構(gòu)造函數(shù)的調(diào)用" << endl;
    };
    Solution(const Solution& s):m_num1(s.m_num1), m_num2(s.m_num2){
        cout << "拷貝構(gòu)造函數(shù)的調(diào)用" << endl;
    } 
    ~Solution(){
        cout << "析構(gòu)函數(shù)的調(diào)用" << endl;
    }
public:
    int m_num1;
    int m_num2;
};

void showClassNum(Solution s) {
    cout << s.m_num1 << endl;
    cout << s.m_num2 << endl;
}

int main()
{
    Solution s1(10,11);
    showClassNum(s1);
    system("pause");
    return 0;
}

代碼運(yùn)行結(jié)果為:

通過(guò)代碼運(yùn)行結(jié)果可以看到,s1對(duì)象調(diào)用了有參構(gòu)造函數(shù),當(dāng)把s1傳給函數(shù)的參數(shù)s的時(shí)候調(diào)用了拷貝構(gòu)造函數(shù),函數(shù)執(zhí)行完調(diào)用了s對(duì)象的析構(gòu)函數(shù)。

當(dāng)函數(shù)的返回值是一個(gè)對(duì)象的時(shí)候,也會(huì)調(diào)用拷貝構(gòu)造函數(shù):

#include <iostream>
using namespace std;

class Solution{
public:
    Solution(int a, int b):m_num1(a), m_num2(b) {
        cout << "有參構(gòu)造函數(shù)的調(diào)用" << endl;
    };
    Solution(const Solution& s):m_num1(s.m_num1), m_num2(s.m_num2){
        cout << "拷貝構(gòu)造函數(shù)的調(diào)用" << endl;
    } 
    ~Solution(){
        cout << "析構(gòu)函數(shù)的調(diào)用" << endl;
    }

    void changeNum(int a, int b) {
        m_num1 = a;
        m_num2 = b;
    }

    void showNum() {
        cout << "m_num1 = " << m_num1 << endl;
        cout << "m_num2 = " << m_num2 << endl;
    }
public:
    int m_num1;
    int m_num2;
};

Solution clearClassNum(Solution s) {
    s.changeNum(0,0);
    return s;
}

int main()
{
    Solution s1 (10,10);
    s1 = clearClassNum (s1);
    s1.showNum();
    system("pause");
    return 0;
}

代碼運(yùn)行結(jié)果為:

從代碼運(yùn)行結(jié)果可以看出來(lái),函數(shù)傳參的時(shí)候調(diào)用了拷貝構(gòu)造,然后函數(shù)返回一個(gè)對(duì)象的時(shí)候的也調(diào)用了拷貝構(gòu)造。

需要注意的是,函數(shù)要返回對(duì)象的時(shí)候,不要使用引用的方式返回,因?yàn)楹瘮?shù)的內(nèi)的變量存放在堆棧區(qū),在函數(shù)執(zhí)行完畢后就會(huì)釋放這塊內(nèi)存,引用就會(huì)出現(xiàn)問(wèn)題。

3、深拷貝和淺拷貝

面試的時(shí)候比較喜歡問(wèn)的問(wèn)題,首先淺拷貝就是我們常用的拷貝,實(shí)現(xiàn)了對(duì)象成員的拷貝,深拷貝就是在堆區(qū)申請(qǐng)空間,然后再進(jìn)行拷貝操作,淺拷貝可以由編譯器完成,但是深拷貝需要我們自己完成,就是有在堆區(qū)開(kāi)辟的內(nèi)存,就一定要自己提供拷貝構(gòu)造函數(shù),防止淺拷貝帶來(lái)的重復(fù)內(nèi)存釋放問(wèn)題。代碼驗(yàn)證如下:

#include <iostream>
using namespace std;

class Solution{
public:
    Solution(int a, int b):m_num1(a), pm_num2(new int(b)) {
        cout << "有參構(gòu)造函數(shù)的調(diào)用" << endl;
    };
      //如果不利用深拷貝在堆區(qū)創(chuàng)建新內(nèi)存,會(huì)導(dǎo)致淺拷貝帶來(lái)的重復(fù)釋放堆區(qū)問(wèn)題,導(dǎo)致程序出錯(cuò)
    Solution(const Solution& s):m_num1(s.m_num1), pm_num2(new int(*s.pm_num2)) {
        cout << "拷貝構(gòu)造函數(shù)的調(diào)用" << endl;
    }
    ~Solution(){
        cout << "析構(gòu)函數(shù)的調(diào)用,釋放堆區(qū)申請(qǐng)的內(nèi)存" << endl;
        if (pm_num2 != nullptr) {
            delete pm_num2;
        }
    }

    void changeNum(int a, int b) {
        m_num1 = a;
        *pm_num2 = b;
    }

    void showNum() {
        cout << "m_num1 = " << m_num1 << endl;
        cout << "m_num2 = " << *pm_num2 << endl;
    }
public:
    int m_num1;
    int* pm_num2;
};

void func()
{
    Solution s1 (10,10);
    Solution s2(s1);
    s2.showNum();
}

int main()
{

    func();
    system("pause");
    return 0;
}

代碼運(yùn)行結(jié)果為:

總結(jié)

到此這篇關(guān)于C++構(gòu)造函數(shù)注意事項(xiàng)的文章就介紹到這了,更多相關(guān)C++構(gòu)造函數(shù)注意事項(xiàng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言游戲必備:光標(biāo)定位與顏色設(shè)置的實(shí)現(xiàn)方法

    C語(yǔ)言游戲必備:光標(biāo)定位與顏色設(shè)置的實(shí)現(xiàn)方法

    本篇文章是對(duì)c語(yǔ)言中光標(biāo)定位與顏色設(shè)置的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C/C++中指針和引用之相關(guān)問(wèn)題深入研究

    C/C++中指針和引用之相關(guān)問(wèn)題深入研究

    從內(nèi)存分配上看,程序?yàn)橹羔樧兞糠峙鋬?nèi)存區(qū)域,而不為引用分配內(nèi)存區(qū)域,因?yàn)橐寐暶鲿r(shí)必須初始化,從而指向一個(gè)已經(jīng)存在的對(duì)象。引用不能指向空值
    2013-10-10
  • C/C++實(shí)現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換的多種方法

    C/C++實(shí)現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換的多種方法

    在C/C++程序中,會(huì)需要把數(shù)字與字符串做出互相轉(zhuǎn)換的操作,用于實(shí)現(xiàn)程序想要的效果,下面將介紹多種方法實(shí)現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-08-08
  • C++中初始化二維數(shù)組的幾種常見(jiàn)方法

    C++中初始化二維數(shù)組的幾種常見(jiàn)方法

    本文詳細(xì)介紹了在C++中初始化二維數(shù)組的不同方式,包括靜態(tài)初始化、循環(huán)、全部為零、部分初始化、std::array和std::vector,以及std::vector作為動(dòng)態(tài)二維數(shù)組的靈活性和應(yīng)用場(chǎng)景,需要的朋友可以參考下
    2025-04-04
  • Visual Studio Code安裝和配置的教程

    Visual Studio Code安裝和配置的教程

    這篇文章主要介紹了Visual Studio Code安裝和配置,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C++ string替換單個(gè)指定字符為其它字符問(wèn)題

    C++ string替換單個(gè)指定字符為其它字符問(wèn)題

    這篇文章主要介紹了C++ string替換單個(gè)指定字符為其它字符問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • C/C++實(shí)現(xiàn)發(fā)送與接收HTTP/S請(qǐng)求的示例代碼

    C/C++實(shí)現(xiàn)發(fā)送與接收HTTP/S請(qǐng)求的示例代碼

    HTTP(Hypertext Transfer Protocol)是一種用于傳輸超文本的協(xié)議,它是一種無(wú)狀態(tài)的、應(yīng)用層的協(xié)議,用于在計(jì)算機(jī)之間傳輸超文本文檔,通常在 Web 瀏覽器和 Web 服務(wù)器之間進(jìn)行數(shù)據(jù)通信,本文給大家介紹了C/C++發(fā)送與接收HTTP/S請(qǐng)求,需要的朋友可以參考下
    2023-11-11
  • C語(yǔ)言二叉排序(搜索)樹(shù)實(shí)例

    C語(yǔ)言二叉排序(搜索)樹(shù)實(shí)例

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言二叉排序樹(shù)實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • C語(yǔ)言三子棋的實(shí)現(xiàn)思路到過(guò)程詳解

    C語(yǔ)言三子棋的實(shí)現(xiàn)思路到過(guò)程詳解

    所謂三子棋,就是三行三列的棋盤(pán),玩家可以和電腦下棋,率先連成三個(gè)的獲勝。這篇文章主要為大家詳細(xì)介紹了如何通過(guò)C語(yǔ)言實(shí)現(xiàn)三子棋小游戲,感興趣的小伙伴可以嘗試一下
    2023-02-02
  • 淺析操作系統(tǒng)中的虛擬地址與物理地址

    淺析操作系統(tǒng)中的虛擬地址與物理地址

    本文主要介紹了操作系統(tǒng)中的虛擬地址與物理地址。在早期的計(jì)算機(jī)中,要運(yùn)行一個(gè)程序,會(huì)把這些程序全都裝入內(nèi)存,程序都是直接運(yùn)行在內(nèi)存上的,也就是說(shuō)程序中訪問(wèn)的內(nèi)存地址都是實(shí)際的物理內(nèi)存地址。那當(dāng)程序同時(shí)運(yùn)行多個(gè)程序時(shí),操作系統(tǒng)是如何為這些程序分配內(nèi)存的呢
    2021-06-06

最新評(píng)論

通化县| 闽侯县| 玛多县| 曲松县| 雷州市| 建阳市| 石台县| 仙居县| 鲁甸县| 滁州市| 黄山市| 什邡市| 商河县| 桐乡市| 页游| 乐陵市| 武穴市| 隆化县| 南召县| 广安市| 宁阳县| 景谷| 宜州市| 赫章县| 蚌埠市| 孟州市| 扶沟县| 宝应县| 天水市| 巴彦淖尔市| 印江| 秀山| 涞水县| 崇信县| 大渡口区| 丹阳市| 新郑市| 泰来县| 托里县| 木里| 潢川县|