【问题标题】:Short c++ class constructor from brace-enclosed initializer list来自大括号的初始值设定项列表中的简短 C++ 类构造函数
【发布时间】:2020-04-11 00:39:26
【问题描述】:

以下核心工作正常:

class A {
public:
    int a;
    int b;
};

A obj{ 1, 2 };

但是,如果显式添加默认构造函数:A(){},则必须为大括号括起来的初始值设定项列表添加另一个,例如:

A(int a, int b):a(a), b(b) {}.

是否有更短的形式,例如:

A(const A& ab) { *this = ab } ???

上面那个不行。

【问题讨论】:

  • 你要写一个更短的构造函数吗?
  • @Frontear 似乎问题是,当显式存在默认构造函数时,是否可以在不写出完整的 A(int a, int b) 构造函数的情况下使 A obj{ 1, 2 }; 工作。
  • 为什么需要默认构造函数?也许您可以改用类内成员初始化(例如:class A { public: int a = 1; int b = 2; };)并获得编译器生成的构造函数的所有好处?

标签: c++ class constructor initializer-list


【解决方案1】:

很遗憾没有。

当您创建默认构造函数时,您阻止自己使用聚合初始化来初始化类。

为了能够恢复使用该声明语法的能力,您必须创建另一个构造函数来接受所有必要的参数……而且没有比您编写的更短的方法了。

【讨论】:

    【解决方案2】:
    A(int a, int b):a(a), b(b) {}.
    

    有没有更短的形式

    没有。除了几个空格之外,这个构造函数尽可能短。

    【讨论】:

      最近更新 更多