在同一 class 中使用构造函数调用构造函数
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
}
call A();
创建一个新的临时对象,该对象在此语句后立即删除。因为默认构造函数 A()
没有初始化数据成员 a
和 b
然后它输出垃圾。
这个临时对象与构造函数A( int, int )
创建的对象没有共同点。
您可以按以下方式重写 class:
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
}
要使用委托构造函数(即使用另一个构造函数来完成同一对象的构造过程),您必须在初始化列表中使用已删除的构造函数:
A(int x , int y) : A() { a=x; b=y; }
不幸的是,当你使用委托时,委托必须是列表中唯一的meminiinitializer。这要求 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;
}
我期待输出 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
}
call A();
创建一个新的临时对象,该对象在此语句后立即删除。因为默认构造函数 A()
没有初始化数据成员 a
和 b
然后它输出垃圾。
这个临时对象与构造函数A( int, int )
创建的对象没有共同点。
您可以按以下方式重写 class:
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
}
要使用委托构造函数(即使用另一个构造函数来完成同一对象的构造过程),您必须在初始化列表中使用已删除的构造函数:
A(int x , int y) : A() { a=x; b=y; }
不幸的是,当你使用委托时,委托必须是列表中唯一的meminiinitializer。这要求 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;
}