91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c++如何禁止函數的傳值調用操作

發布時間:2020-08-12 11:56:38 來源:億速云 閱讀:222 作者:小新 欄目:開發技術

這篇文章主要介紹了c++如何禁止函數的傳值調用操作,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

代碼編譯運行環境:VS2017+Debug+Win32

按照參數形式的不同,C++應該有三種函數調用方式:傳值調用、引用調用和指針調用。對于基本數據類型的變量作為實參進行參數傳遞時,采用傳值調用與引用調用和指針調用的效率相差不大。但是,對于類類型來說,傳值調用和引用調用之間的區別很大,類對象的尺寸越大,這種差別越大。

傳值調用與后面兩者的區別在于傳值調用在進入函數體之前,會在棧上建立一個實參的副本,而引用和指針調用沒有這個動作。建立副本的操作是利用拷貝構造函數進行的。因此,要禁止傳值調用,就必須在類的拷貝構造函數上做文章。

可以直接在拷貝構造函數中拋出異常,這樣就迫使程序員不能使用拷貝構造函數,否則程序總是出現運行時錯誤。但是,這不是一個好的辦法,應該在編譯的階段就告訴程序員,不能使用該類的拷貝構造函數。

1.不顯示定義拷貝構造函數可行嗎?

#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);
}

以上程序順利通過編譯,并輸出5。因此,不顯示定義拷貝構造函數,并不能阻止對類的拷貝構造函數的調用,原因是編譯器會自動為沒有顯示定義拷貝構造函數的類提供一個默認的拷貝構造函數。

2.顯示定義拷貝構造函數并將訪問權限設置為private

上面的程序添加拷貝構造函數的定義,修改如下。

#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);
}

這個程序在VS2017環境下編譯不通過,得到如下錯誤:error C2248: “A::A”: 無法訪問 private 成員(在“A”類中聲明)。
 這樣就能阻止了函數調用時,類A的對象以值傳遞的方式進行函數函數調用。為使程序通過編譯,需將show()函數的定義改為如下形式:

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

3.拷貝構造函數的說明

(1)如果將拷貝構造函數中的引用符號去掉&,編譯將無法通過,出錯的信息如下:非法的復制構造函數: 第一個參數不應是“A”。原因是如果拷貝構造函數中的參數不是一個引用,即形如A(const A a),那么就相當于采用了傳值的方式(pass-by-value),而傳值的方式會調用該類的拷貝構造函數,從而造成無窮遞歸地調用拷貝構造函數。因此拷貝構造函數的參數必須是一個引用或一個指針。

(2)拷貝構造函數的參數通常情況下是const的,但是const并不是嚴格必須的。

(3)附帶說明,在下面幾種情況下會調用拷貝構造函數:

 a. 顯式或隱式地用同類型的一個對象來初始化另外一個對象;
 b. 作為實參以值傳遞的方式傳遞給一個函數;
 c. 在函數體內返回一個對象時,也會調用返回值類型的拷貝構造函數;
 d. 需要產生一個臨時類對象時(類對象作為函數返回值會創建臨時對象)。

感謝你能夠認真閱讀完這篇文章,希望小編分享c++如何禁止函數的傳值調用操作內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

萍乡市| 体育| 嘉禾县| 锡林浩特市| 广德县| 江山市| 商城县| 龙泉市| 星座| 大冶市| 昌黎县| 梅州市| 江都市| 揭东县| 盐山县| 鄱阳县| 韩城市| 鄂伦春自治旗| 克拉玛依市| 博白县| 安顺市| 屏东县| 博野县| 岫岩| 五指山市| 克拉玛依市| 乐东| 天峻县| 阜康市| 南岸区| 宁明县| 望奎县| 格尔木市| 南丹县| 林甸县| 北安市| 南华县| 淮安市| 堆龙德庆县| 金门县| 大荔县|