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

c++禁止函數(shù)的傳值調(diào)用的方法

 更新時(shí)間:2020年08月11日 12:04:32   作者:Dabelv  
這篇文章主要介紹了c++禁止函數(shù)的傳值調(diào)用的方法,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

代碼編譯運(yùn)行環(huán)境:VS2017+Debug+Win32

按照參數(shù)形式的不同,C++應(yīng)該有三種函數(shù)調(diào)用方式:傳值調(diào)用、引用調(diào)用和指針調(diào)用。對(duì)于基本數(shù)據(jù)類(lèi)型的變量作為實(shí)參進(jìn)行參數(shù)傳遞時(shí),采用傳值調(diào)用與引用調(diào)用和指針調(diào)用的效率相差不大。但是,對(duì)于類(lèi)類(lèi)型來(lái)說(shuō),傳值調(diào)用和引用調(diào)用之間的區(qū)別很大,類(lèi)對(duì)象的尺寸越大,這種差別越大。

傳值調(diào)用與后面兩者的區(qū)別在于傳值調(diào)用在進(jìn)入函數(shù)體之前,會(huì)在棧上建立一個(gè)實(shí)參的副本,而引用和指針調(diào)用沒(méi)有這個(gè)動(dòng)作。建立副本的操作是利用拷貝構(gòu)造函數(shù)進(jìn)行的。因此,要禁止傳值調(diào)用,就必須在類(lèi)的拷貝構(gòu)造函數(shù)上做文章。

可以直接在拷貝構(gòu)造函數(shù)中拋出異常,這樣就迫使程序員不能使用拷貝構(gòu)造函數(shù),否則程序總是出現(xiàn)運(yùn)行時(shí)錯(cuò)誤。但是,這不是一個(gè)好的辦法,應(yīng)該在編譯的階段就告訴程序員,不能使用該類(lèi)的拷貝構(gòu)造函數(shù)。

1.不顯示定義拷貝構(gòu)造函數(shù)可行嗎?

#include <iostream>
using namespace std;

class A
{
public:
	int num;
	A(){num=5;}
};

void show(A a)
{
	cout<<a.num<<endl;
}

int main()
{
	A obj;
	show(obj);
}

以上程序順利通過(guò)編譯,并輸出5。因此,不顯示定義拷貝構(gòu)造函數(shù),并不能阻止對(duì)類(lèi)的拷貝構(gòu)造函數(shù)的調(diào)用,原因是編譯器會(huì)自動(dòng)為沒(méi)有顯示定義拷貝構(gòu)造函數(shù)的類(lèi)提供一個(gè)默認(rèn)的拷貝構(gòu)造函數(shù)。

2.顯示定義拷貝構(gòu)造函數(shù)并將訪問(wèn)權(quán)限設(shè)置為private

上面的程序添加拷貝構(gòu)造函數(shù)的定義,修改如下。

#include <iostream>
using namespace std;

class A
{
	A(const A&){};
public:
	int num;
	A(){num=5;}

};

void show(A a)
{
	cout<<a.num<<endl;
}

int main()
{
	A obj;
	show(obj);
}

這個(gè)程序在VS2017環(huán)境下編譯不通過(guò),得到如下錯(cuò)誤:error C2248: “A::A”: 無(wú)法訪問(wèn) private 成員(在“A”類(lèi)中聲明)。
 這樣就能阻止了函數(shù)調(diào)用時(shí),類(lèi)A的對(duì)象以值傳遞的方式進(jìn)行函數(shù)函數(shù)調(diào)用。為使程序通過(guò)編譯,需將show()函數(shù)的定義改為如下形式:

void show(const A& a)
{
	cout<<a.num<<endl;
}

3.拷貝構(gòu)造函數(shù)的說(shuō)明

(1)如果將拷貝構(gòu)造函數(shù)中的引用符號(hào)去掉&,編譯將無(wú)法通過(guò),出錯(cuò)的信息如下:非法的復(fù)制構(gòu)造函數(shù): 第一個(gè)參數(shù)不應(yīng)是“A”。原因是如果拷貝構(gòu)造函數(shù)中的參數(shù)不是一個(gè)引用,即形如A(const A a),那么就相當(dāng)于采用了傳值的方式(pass-by-value),而傳值的方式會(huì)調(diào)用該類(lèi)的拷貝構(gòu)造函數(shù),從而造成無(wú)窮遞歸地調(diào)用拷貝構(gòu)造函數(shù)。因此拷貝構(gòu)造函數(shù)的參數(shù)必須是一個(gè)引用或一個(gè)指針。

(2)拷貝構(gòu)造函數(shù)的參數(shù)通常情況下是const的,但是const并不是嚴(yán)格必須的。

(3)附帶說(shuō)明,在下面幾種情況下會(huì)調(diào)用拷貝構(gòu)造函數(shù):

 a. 顯式或隱式地用同類(lèi)型的一個(gè)對(duì)象來(lái)初始化另外一個(gè)對(duì)象;
 b. 作為實(shí)參以值傳遞的方式傳遞給一個(gè)函數(shù);
 c. 在函數(shù)體內(nèi)返回一個(gè)對(duì)象時(shí),也會(huì)調(diào)用返回值類(lèi)型的拷貝構(gòu)造函數(shù);
 d. 需要產(chǎn)生一個(gè)臨時(shí)類(lèi)對(duì)象時(shí)(類(lèi)對(duì)象作為函數(shù)返回值會(huì)創(chuàng)建臨時(shí)對(duì)象)。

以上就是c++禁止函數(shù)的傳值調(diào)用的方法的詳細(xì)內(nèi)容,更多關(guān)于c++禁止函數(shù)的傳值調(diào)用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vscode分享代碼插件Polacode介紹

    vscode分享代碼插件Polacode介紹

    這篇文章主要介紹了vscode分享代碼插件Polacode的相關(guān)知識(shí),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • opencv利用視頻的前n幀求平均圖像

    opencv利用視頻的前n幀求平均圖像

    這篇文章主要為大家詳細(xì)介紹了opencv利用視頻的前n幀求平均圖像,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • stl容器set,map,vector之erase用法與返回值詳細(xì)解析

    stl容器set,map,vector之erase用法與返回值詳細(xì)解析

    在使用 list、set 或 map遍歷刪除某些元素時(shí)可以這樣使用,如下所示
    2013-09-09
  • c++禁止函數(shù)的傳值調(diào)用的方法

    c++禁止函數(shù)的傳值調(diào)用的方法

    這篇文章主要介紹了c++禁止函數(shù)的傳值調(diào)用的方法,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷游戲

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C/C++解析文件名和目錄路徑的方法

    C/C++解析文件名和目錄路徑的方法

    #include <libgen.h> 是一個(gè) C/C++ 語(yǔ)言的頭文件,主要用于字符串處理,特別是在處理文件路徑時(shí),它提供了一些函數(shù)來(lái)幫助你解析文件名和目錄路徑,本文就給大家介紹一下C/C++解析文件名和目錄路徑的方法,需要的朋友可以參考下
    2024-10-10
  • CLOSE_WAIT狀態(tài)解決方案

    CLOSE_WAIT狀態(tài)解決方案

    這篇文章主要介紹了CLOSE_WAIT狀態(tài)解決方案,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C語(yǔ)言 超詳細(xì)介紹與實(shí)現(xiàn)線性表中的帶頭雙向循環(huán)鏈表

    C語(yǔ)言 超詳細(xì)介紹與實(shí)現(xiàn)線性表中的帶頭雙向循環(huán)鏈表

    帶頭雙向循環(huán)鏈表:結(jié)構(gòu)最復(fù)雜,一般用在單獨(dú)存儲(chǔ)數(shù)據(jù)。實(shí)際中使用的鏈表數(shù)據(jù)結(jié)構(gòu),都是帶頭雙向循環(huán)鏈表。另外這個(gè)結(jié)構(gòu)雖然結(jié)構(gòu)復(fù)雜,但是使用代碼實(shí)現(xiàn)以后會(huì)發(fā)現(xiàn)結(jié)構(gòu)會(huì)帶來(lái)很多優(yōu)勢(shì),實(shí)現(xiàn)反而簡(jiǎn)單
    2022-03-03
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)旋轉(zhuǎn)鏈表的實(shí)現(xiàn)

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)旋轉(zhuǎn)鏈表的實(shí)現(xiàn)

    這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)旋轉(zhuǎn)鏈表的實(shí)現(xiàn)的相關(guān)資料,這里提供實(shí)例幫助大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-08-08
  • C++詳細(xì)實(shí)現(xiàn)紅黑樹(shù)流程詳解

    C++詳細(xì)實(shí)現(xiàn)紅黑樹(shù)流程詳解

    今天我要跟大家介紹二叉搜索樹(shù)中的另一顆樹(shù)——紅黑樹(shù),它主要是通過(guò)控制顏色來(lái)控制自身的平衡,但它的平衡沒(méi)有AVL樹(shù)的平衡那么嚴(yán)格
    2022-06-06

最新評(píng)論

太和县| 温州市| 长丰县| 塘沽区| 淮南市| 沙湾县| 青海省| 台中市| 玉溪市| 新丰县| 甘孜县| 万盛区| 通城县| 禄劝| 中山市| 舒兰市| 宜良县| 南开区| 应城市| 加查县| 晋宁县| 南汇区| 广宁县| 封开县| 微山县| 临沧市| 台北市| 苍梧县| 剑河县| 清丰县| 黄梅县| 辰溪县| 贵阳市| 遂宁市| 吉木乃县| 陆川县| 镇原县| 瓮安县| 深水埗区| 万源市| 金阳县|