簡體   English   中英

在同一個類的構造函數中調用構造函數

[英]Calling Constructor with in constructor in same class

我期待輸出2,3,但我得到了垃圾值。 為什么?

這是我的代碼:

#include <iostream>
using namespace std;

class A
{
public:
    int a, b;

    A()
    {
        cout << a << " " << b;
    }

    A(int x, int y)
    {
        a = x;
        b = y;
        A(); // calling the default constructor
    }
};

int main()
{
    A ob(2, 3);
    return 0;
}

在這個構造函數中:

A(int x, int y)
{
    a = x;
    b = y;
    A(); // calling the default constructor
}

A(); 創建一個在此語句后立即刪除的新臨時對象。 因為默認構造函數A()沒有初始化數據成員ab然后它輸出一個垃圾。

此臨時對象與構造函數A( int, int )創建的對象沒有任何共同之處。

您可以通過以下方式重寫您的課程:

class A
{
public:
    int a, b;

    A(): A(0, 0) {}

    A(int x, int y) : a(x), b(y)
    {
        cout << a << " " << b;
    }
};

在這里輸出未初始化的a和b:

A(){
cout<<a<<" "<<b;
}

在這里你初始化a和b,但是你創建了一個非常有用的臨時對象

A(int x , int y){
    a = x; b= y;
    A(); // !!!! CREATES AT TEMPORARY ANONYMOUS OBJECT WITH IT'S OWN a and B
}

要使用委托構造函數(即使用另一個構造函數來完成SAME對象的構造過程),必須在初始化列表中使用delegeted構造函數:

A(int x , int y) : A() { a=x; b=y;  } 

不幸的是 ,當您使用委托時,委托必須是列表中唯一的meminitializer。 這要求a和b的初始化將在A()之后發生。

另一種選擇:

class A
{
public:
    int a, b;
    A() :  A(0, 0) { }  // use a delegated ctor 
    A(int x, int y) : a(x), b(y) { cout << a << " " << b; }
};

還有另一種選擇,使用默認值(不重用構造函數):

class A
{
public:
    int a, b;
    A(int x=0, int y=0) : a(x), b(y) { cout << a << " " << b; }
};

您沒有調用默認構造函數,您所做的是創建一個臨時A對象,它恰好在打印輸出之前使其成員未初始化。 也許你想要做的是構造函數委托,它看起來像

#include <iostream>

class A
{
    int a, b;
public:
    A(): A( 0, 0 ) {
        std::cout << a << ", " << b << std::endl;
    }
    A( int x, int y ): a( x ), b( y ) {}
}

int main()
{
    A object_a {}; //prints 0, 0
    return 0;
}

暫無
暫無

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

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