欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

1.不顯示定義拷貝構造函數(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);
}

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

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

上面的程序添加拷貝構造函數(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);
}

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

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

3.拷貝構造函數(shù)的說明

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

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

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

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

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

相關文章

  • C++實現(xiàn)將s16le的音頻流轉換為float類型

    C++實現(xiàn)將s16le的音頻流轉換為float類型

    這篇文章主要為大家詳細介紹了如何利用C++實現(xiàn)將s16le的音頻流轉換為float類型,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-04-04
  • C++ 中的INT_MAX,INT_MIN數(shù)值大小操作

    C++ 中的INT_MAX,INT_MIN數(shù)值大小操作

    這篇文章主要介紹了C++ 中的INT_MAX,INT_MIN數(shù)值大小操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • OpenCV霍夫變換(Hough Transform)直線檢測詳解

    OpenCV霍夫變換(Hough Transform)直線檢測詳解

    這篇文章主要為大家詳細介紹了OpenCV霍夫變換直線檢測的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C++中四種強制轉換方式的區(qū)別

    C++中四種強制轉換方式的區(qū)別

    在C++中,有四種不同的強制轉換方式,它們分別是靜態(tài)轉換、動態(tài)轉換、常量轉換和重新解釋轉換,下面通過示例代碼講解每種轉換的區(qū)別,感興趣的朋友跟隨小編一起看看吧
    2023-08-08
  • C++讀寫.mat文件的方法

    C++讀寫.mat文件的方法

    本文介紹了“C++讀寫.mat文件的方法”,需要的朋友可以參考一下
    2013-03-03
  • 一文帶你搞懂C語言預處理宏定義

    一文帶你搞懂C語言預處理宏定義

    這篇文章主要為大家詳細介紹了C語言預處理宏定義#define,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-10-10
  • C語言中const,指針和引用的關系

    C語言中const,指針和引用的關系

    這篇文章主要為大家介紹了C語言的const,指針和引用,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C/C++獲取目錄下的文件列表信息

    C/C++獲取目錄下的文件列表信息

    在C/C++編程時,需要獲取目錄下面的文件列表信息,下面把代碼分享一下
    2014-02-02
  • 一文詳解C++11中的lambda函數(shù)

    一文詳解C++11中的lambda函數(shù)

    小編可以明確告訴大家:lambda函數(shù)是C++11中最重要的,使用最廣泛的,最具現(xiàn)代風格的內(nèi)容,lambda函數(shù)的出現(xiàn)改變了C++編程的思維方式。所以快和小編學習一下C++11中l(wèi)ambda函數(shù)的使用吧
    2023-02-02
  • C語言一級指針二級指針和三級指針區(qū)別及使用詳解

    C語言一級指針二級指針和三級指針區(qū)別及使用詳解

    這篇文章主要為大家介紹了C語言一級指針二級指針和三級指針,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05

最新評論