[英]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()
沒有初始化數據成員a
和b
然后它輸出一個垃圾。
此臨時對象與構造函數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.