簡體   English   中英

什么時候沒有調用c ++構造函數?

[英]When is a c++ constructor not called?

我有一種情況,似乎沒有調用構造函數:

#include <iostream>

using namespace std;

int main ()
{
    class yoyo
    {
        public:
        int i;
        yoyo()
        {
            i = 0;
            cout << "defaultly initialized to 0" << endl;
        }
        yoyo (int j) : i(j)
        {
            cout << "initialized to " << j << endl;
        }
    };

    int i;

    yoyo a;
    cout << "Hello1, i: " << a.i << endl;

    yoyo b(5);
    cout << "Hello2, i: " << b.i << endl;

    yoyo c = b;                                   /* 1 */
    cout << "Hello3, i: " << c.i << endl;

    return 0;
}

輸出是:

defaultly initialized to 0
Hello1, i: 0
initialized to 5
Hello2, i: 5
Hello3, i: 5

(注意:Hello2和Hello3之間沒有任何內容)

如果我將程序更改為如下所示:

#include <iostream>

using namespace std;

int main ()
{
    class yoyo
    {
        public:
        int i;
        yoyo()
        {
            i = 0;
            cout << "defaultly initialized to 0" << endl;
        }
        yoyo (int j) : i(j)
        {
            cout << "initialized to " << j << endl;
        }
    };

    int i;

    yoyo a;
    cout << "Hello1, i: " << a.i << endl;

    yoyo b(5);
    cout << "Hello2, i: " << b.i << endl;

    yoyo c; c = b;                                  /* 1 */
    cout << "Hello3, i: " << c.i << endl;

    return 0;
}

(唯一的區別在於他標有/ * 1 * /的行)

現在的輸出是:

defaultly initialized to 0
Hello1, i: 0
initialized to 5
Hello2, i: 5
defaultly initialized to 0
Hello3, i: 5

現在Hello2和Hello3之間有一個構造函數調用。 我的問題是,為什么在第一種情況下沒有(可見)構造函數調用?

如果是

yoyo c = b;

它是被調用的復制構造函數

而在這種情況下

yoyo c; c = b;

它是被調用的復制賦值運算符。

如果您不提供其中任何一個,編譯器將為您生成默認版本。


如果要創建自己的復制構造函數,它可能如下所示:

yoyo(const yoyo& other)
    : i(other.i)
    { std::cout << "copy constructor initialized\n"; }

復制賦值運算符如下所示:

yoyo& operator=(const yoyo& other)
    {
        i = other.i;
        return *this;
    }

當然類定義他們兩個定義。

在第一種情況下:

yoyo c = b;   

調用copy constructor ,在這種情況下,編譯器會隱式生成copy constructor

 yoyo c = b; 

這稱為復制初始化 ; 將調用編譯器生成的復制構造函數,並使用該副本初始化c 此外,將調用c的默認構造函數。

c = b;

這里,這不是初始化,這是賦值。 將在該行上調用編譯器生成的賦值運算符。

在你的代碼中,

yoyo c=b將調用復制構造函數。如果要查看它被調用,則必須明確定義它。

例如:

yoyo(const yoyo& obj)
{
   this->i=obj.i;  cout<<"copy constructor"<<endl;
}

在第二種情況下,它將調用構造函數,然后調用賦值運算符

yoyo c; //constructor
c = b;  //assignment operator for which only copying occurs

你可以重載賦值運算符,如下所示

yoyo& operator=(yoyo& obj)
{
    i = obj.i;
    cout << "assignment operator" << endl;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM