繁体   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