【问题标题】:calling one constructor from another in same class从同一类中的另一个调用一个构造函数
【发布时间】:2012-11-11 02:35:48
【问题描述】:

1) 第一个代码

class A
{
public:
    int i;
    int b;
    A(int temp){
        i=temp;
        A();
        b=0;
    }

    A(){
        b=0;
    }

    void display(){
        printf("%d %d\n",i,b);//1 0
    }
};

int  main(){
    A Aobj(1);
    Aobj.display();
    return 0;
}

输出:1 0

2) 第二个密码

class A
{
public:
    int i;
    int b;
    A(int temp) : i(temp), A(), b(0) {}//Error
    A() : b(0) {}
    void display(){
        printf("%d %d\n",b,i);
    }
};

int  main()
{
    A Aobj(1);
    Aobj.display();
    return 0;
}

我原以为这两个代码都将显示相同的行为,并且会产生错误,因为不允许在同一类中从另一个构造函数调用一个构造函数。 它不是 C++11。

那么为什么使用初始化器列表会有所不同呢? 我在 g++ 4.3.4 中编译了这些代码。

【问题讨论】:

  • C++11 允许像第二个示例中那样委派构造函数,而不是在正文中调用它们。出于这个原因,听起来您从一开始就期待一个错误,所以我想确保这一点很清楚。
  • 第二个克里斯,您应该阅读有关 C++ 委托构造函数的内容。参考:nullptr.me/2012/01/17/c11-delegating-constructors

标签: c++ class constructor compiler-errors


【解决方案1】:

A(); 没有做你认为的事情。

将其替换为double();char(); 或任何其他类型。请注意,它有效。

您所做的只是创建该类型的匿名附加实例,然后将其丢弃。它对this 没有影响,也不会像你认为的那样做。

初始化列表在 C++11 中的工作方式与您期望的一样。

【讨论】:

  • 请多解释一下。我应该替换什么。以及为什么它适用于替换。我知道我违反了规则,但为什么两种情况的规则都不相同,因为两者都应该是错误的。
  • 在你的代码中只有一个地方你有字符A(); 对吗?那不是在做你认为它正在做的事情。它正在创建一个不相关的 A 类型临时文件,然后将其丢弃。
  • 这个语句有什么作用:int();?这个函数怎么样:void foo (){ A(); }?这个函数void bar() { A a = A(); }怎么样?
【解决方案2】:

这和 C++11 一点关系都没有。

正如 Yakk 在第一种情况中指出的那样,您通过不同的构造函数(默认构造函数)非递归地构造匿名成员。

如果是“B”;您尝试从 initialzier 列表中初始化一个不存在的成员。您没有要初始化的 AA* 的实例存在于 A 中。

【讨论】:

    猜你喜欢
    • 2014-03-12
    • 2012-06-22
    • 1970-01-01
    • 2014-08-01
    • 2020-03-14
    • 1970-01-01
    • 2020-11-07
    • 2011-03-24
    相关资源
    最近更新 更多