1. 程式人生 > >C++拷貝建構函式_形參為什麼只能是引用(不能傳值或指標)

C++拷貝建構函式_形參為什麼只能是引用(不能傳值或指標)

先給出答案:

拷貝建構函式不能用數值或指標形參原因,不是為了節省建立副本的空間與時間。而是那樣做會無限迴圈遞迴下去。

舉個例子來看一下為什麼會這樣。(反例)

class Example()
{
public:
    Example(int a):aa(a) {}    //建構函式

    Example(Example ex)        //拷貝建構函式(值傳遞引數)
    {
        aa = ex.aa;
    }
private:
    int aa;
};

int main()
{
    Example e1(10);
    Example e2 = e1;
    
    return 0;
}

執行 Example e2 = e1; 時

呼叫了拷貝建構函式(傳值型的)

相當於 e2.Example(e1);

在函式中,因為是值傳遞所以又需要用e1的值拷貝建立一個副本物件ex,則又需要呼叫拷貝建構函式ex.Example(e1)

這樣就會無限重複下去來完成建立副本ex,無限呼叫ex.Example(e1)

這就是為什麼拷貝建構函式不能使用值傳遞的形參原因。

正確拷貝建構函式:

Example(const Example &ex)   
    {
        aa = ex.aa;
    }

..................................................不能用指標的原因待更............................

相關推薦

C++拷貝建構函式_為什麼只能引用不能指標

先給出答案: 拷貝建構函式不能用數值或指標形參原因,不是為了節省建立副本的空間與時間。而是那樣做會無限迴圈遞迴下去。 舉個例子來看一下為什麼會這樣。(反例) class Example() { public: Example(int a):aa(a) {}

為什麼拷貝建構函式必須是引用型別?

複製建構函式只有一個引數,由於在建立時傳入的是同種型別的物件,所以一個很自然的想法是將該型別的物件作為引數,像這樣: Sample (Sample a); 不幸的是,即使是這樣樸實無華的宣告也隱含了一個微妙的錯誤,呵,我們來看看:當某個時候需要以一個Sa

C++拷貝建構函式的引數必須為引用

引數為引用,不為值傳遞是為了防止拷貝建構函式的無限遞迴,最終導致棧溢位。如果複製建構函式是這樣的 : test(test t);我們呼叫test ort;test a(ort);--> test.

C++ 拷貝建構函式程式碼筆記

拷貝建構函式是一種特殊的建構函式,它在建立物件時,是使用同一類中之前建立的物件來初始化新建立的物件。拷貝建構函式通常用於: 通過使用另一個同類型的物件來初始化新建立的物件。 複製物件把它作為引數傳遞給函式。 複製物件,並從函式返回這個物件 #include

C++ 拷貝建構函式this指標練習

總時間限制:  1000ms   記憶體限制:  65536kB // 在此處補充你的程式碼 描述 程式填空,使其按要求輸出 #include <iostream> using namespace std; class A {

C++ 拷貝建構函式練習

總時間限制:  1000ms   記憶體限制:  65536kB // 在此處補充你的程式碼 描述 程式填空,使其輸出9 22 5 #include <iostream> using namespace std; class

C++拷貝建構函式 的理解

#include <iostream> using namespace std; //拷貝建構函式的理解 class Point { public: Point(); Point(int X, int Y); ~Point(); Point(Point

5.4-day04-C++拷貝建構函式/靜態成員

一、拷貝建構函式和拷貝賦值運算子 1.拷貝構造:用一個已有的物件,構造和它同類型的副本物件——克隆。 2.形如 class X {   X (const X& that) { ... } }; 的建構函式成為拷

C++ 拷貝建構函式和賦運算子

本文主要介紹了拷貝建構函式和賦值運算子的區別,以及在什麼時候呼叫拷貝建構函式、什麼情況下呼叫賦值運算子。最後,簡單的分析了下深拷貝和淺拷貝的問題。 拷貝建構函式和賦值運算子 在預設情況下(使用者沒有定義,但是也沒有顯式的刪除),編譯器會自動的隱式生成一個拷貝建構函式和賦值

C++拷貝建構函式和運算子過載VC實現

String.h檔案: #ifndef STRING_H #define STRING_H #include <ostream> using namespace std; class String { public: String(){ m_pStr = nullptr

C++ 拷貝建構函式中淺拷貝與深拷貝

淺拷貝建構函式 看一段拷貝建構函式的程式碼 #include <iostream> #include <cstring> using namespace std; class Array{ public : Array()

C++ 拷貝建構函式和過載賦操作符不能相互呼叫

拷貝建構函式呼叫過載賦值操作符,過載賦值操作符呼叫拷貝建構函式的寫法都是沒有意義的。首先:拷貝建構函式的存在意義--------是通過已有的物件構造新的物件,構造完畢後才有兩個物件;過載賦值操作符的意義-----------將一個物件的值賦給另一個物件,兩個物件都已經構造完畢了。拷貝建構函式----呼叫---

C++:拷貝建構函式&賦運算子的過載函式

拷貝建構函式:          用一個已經存在的物件來生成一個相同型別的新物件。(淺拷貝)預設的拷貝建構函式:          如果自定義了拷貝建構函式,編譯器就不在生成預設的拷貝建構函

C ++ 拷貝建構函式和賦建構函式 非常經典

C++ 拷貝建構函式 賦值建構函式 拷貝建構函式和賦值建構函式的異同 由於並非所有的物件都會使用拷貝建構函式和賦值函式,程式設計師可能對這兩個函式有些輕視。請先記住以下的警告,在閱讀正文時就會多心:如果不主動編寫拷貝建構函式和賦值函式,編譯器將以“位拷貝”的方式自動生成預設的函式。倘若類中含有指標變數,那麼

C++拷貝建構函式中使用初始化列表

    今天同事遇到一個關於拷貝建構函式的問題。程式碼大致如下: class test { public: test( size_t size ) { v.assign( size, 1 ); } test( const test& rhs)

c++拷貝建構函式遇上等號過載

參加完美世界的筆試題目,有個題目是拷貝建構函式呼叫,同時定義了“=”過載,這個時候 =過載函式是否會被呼叫? 做了個實驗,呼叫拷貝建構函式進行初始化的時候,是不會呼叫=過載的。 #include<iostream> #include<vector>

c++拷貝建構函式和賦操作符過載

c++拷貝建構函式: class A { A(const A& a); .... } 由於拷貝建構函式中,一般不允許對原物件進行修改,因此一般在引數中使用const關鍵字進行限制。 拷貝建構函式一般用於需要new記憶體等操作。如果不允許使用拷貝建

C++ 拷貝建構函式與賦函式的區別很嚴謹和全面

這裡我們用類String 來介紹這兩個函式: 拷貝建構函式是一種特殊建構函式,具有單個形參,該形參(常用const修飾)是對該類型別的引用。當定義一個新物件並用一個同類型的物件對它進行初始化時,將顯式使用拷貝建構函式。為啥形參必須是對該型別的引用呢?試

c++拷貝建構函式 && 賦語句

拷貝建構函式 拷貝建構函式的定義: 同一個類的物件在記憶體中有完全相同的結構,如果作為一個整體進行復制或拷貝是完全可行的(以為他們具有同樣的結構)。這個拷貝的過程只需要拷貝資料成員,而

C++拷貝建構函式和operator=

1 拷貝建構函式引數的特點對於一個類X,如果一個建構函式的第一個引數是下列之一:a) X&b) const X&c) volatile X&d) const volatile X&因此 X::X(X&, int=1); //是拷貝建構函