【问题标题】:What is the difference between these C++ codes?这些 C++ 代码有什么区别?
【发布时间】:2016-04-09 18:22:15
【问题描述】:

我正在尝试这个构造函数代码,但对它的工作原理感到困惑..

#include<iostream>
using namespace std;
class XYZ{
    int a,b;
    public:
        XYZ(int i, int j):a(i), b(a*j){}
        void show(){
            cout<<a<<"\t"<<b<<"\n";
        }
};
int main(){
    XYZ X(2,3);
    X.show();
    return 0;
}

它给出了预期的结果,但是,

#include<iostream>
using namespace std;
class XYZ{
    int b,a;
    public:
        XYZ(int i, int j):a(i), b(a*j){}
        void show(){
            cout<<a<<"\t"<<b<<"\n";
        }
};
int main(){
    XYZ X(2,3);
    X.show();
    return 0;
}

给出意想不到的结果。

唯一的区别是int a,b 和int b,a

XYZ(int i, int j):a(i), b(a*j){} 究竟是如何工作的?

【问题讨论】:

  • 每个问题一个问题。我已经告诉过你好几次了。另外,在将近四年和 20 个问题之后,您能否考虑养成正确格式化您的帖子的习惯?句号,大写字母...谢谢。
  • 使用-Wall 来捕捉这个(-Wreorder 是必需的标志,更准确地说,它包含在-Wall 中)。

标签: c++ constructor initialization


【解决方案1】:

嗯,您已经发现了不同之处。这是一个非常重要的。类的成员按照它们在类定义中出现的顺序进行初始化,而不管它们在构造函数的成员初始化器列表中出现的顺序如何。并且由于b的初始化依赖于a的值,所以a应该首先被初始化是很重要的。这就是它起作用的原因:

int a,b;

但这不是:

int b,a;

如果您编写构造函数以使这些依赖项不存在,那会更好(更不容易出错)。那你就不用担心声明的顺序了。

XYZ(int i, int j):a(i), b(i*j){}

【讨论】:

【解决方案2】:

在您的第二个示例中,b 在 a 之前初始化。所以 b 得到了评估 a*j 的结果,其中 a 仍未初始化。

【讨论】:

    猜你喜欢
    • 2012-09-27
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 2011-11-22
    • 2014-09-28
    • 2013-05-13
    相关资源
    最近更新 更多