【问题标题】:table initialization list take to int, in user defined class表初始化列表采用 int,在用户定义的类中
【发布时间】:2012-03-06 03:38:27
【问题描述】:

这是我的短代码

class A {
public:
    int x,y;
    A(int a=0, int b=0) {
        x=a;y=b;
    }
};
int main() {
    A t[2] = {9,3};
    cout << t[0].x << " " << t[0].y << endl;
    cout << t[1].x << " " << t[1].y << endl;
}

输出是:

9 0
3 0

当我评论我的构造函数时:

9 3
0 0

我的问题是:为什么会这样?我试图重载我能想到的所有东西,这意味着:复制构造函数,带有一个,两个参数的构造函数,(coma,equality,[]) 运算符,但我不知道编译器生成什么可以接受 2 个整数一个构造函数并将它们分配给 x,y。我什至尝试将括号中的数字溢出{},通过输入 {99999999999999999999,3} 来查看编译器会喊什么,但它说由于溢出它无法转换 const int,所以我相信它必须是转换,但是如何?

【问题讨论】:

  • 你使用什么编译器?是否启用了 C++11 支持?
  • 这有关系吗?如果是,请考虑这两种情况。

标签: c++ list class constructor user-defined


【解决方案1】:

您将93 隐式转换为A

一个小测试将证明这一点:

class A {
public:
    int x,y;
    explicit A(int a=0, int b=0) {
        x=a;y=b;
    }
};

这会产生编译错误。

这意味着您的代码转换为:

A t[2] = {A(9),A(3)};

由于注释掉了转换构造函数(我们称它为,虽然我不确定),它将不再能够将int 转换为A

第二个 sn-p 只会初始化第一个元素。

编辑:为了澄清,请尝试以下测试:

int x[10] = {1,1,1};

这只会初始化数组的前 3 个元素。

另外,如果没有转换构造函数,请尝试以下操作:

A t[4] = {1,1,2,2};

前 2 个A 将被初始化。

【讨论】:

  • @aragornsql np,希望它能解释这种行为。
  • 我想过,但是如何将 2 个整数转换为 1 个 A。转换模板是:T::operator R() const; ?
  • @aragornsql 这不是强制转换,而是称为转换。它使用转换构造函数。定义没有关键字 explicit 的构造函数 A(int) 将告诉编译器它可以在需要时将 int 隐式转换为 A。谷歌转换构造函数。
  • 好的,我知道什么是转换构造函数了,没关系。对不起,但我没有说清楚。我不知道为什么在不声明任何构造函数的情况下,程序会创建由括号 {9,3} 中给出的 2 个 int 数字组成的对象。我的意思是我完全理解当我有我的构造函数 {9,3} 表示 {(A)9, (A) 3},但我想要的是第一个对象同时接受两个数字,因为我需要使用类似的语法这 {{9,3}} 就像传递两个 2dim 表。没有我的构造函数,我不需要那种语法。我希望你现在能理解我的好奇心
  • @aragornsql 因为这就是这种初始化的工作方式。我将编辑我的答案。
猜你喜欢
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
  • 2019-11-29
  • 2017-09-11
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
相关资源
最近更新 更多