c++ - C++私有(private)区实例变量初始化

标签 c++ object constructor

在 A 类中,counter b(5); 不起作用。

while counter a;(默认构造函数的调用)有效。

为什么?实例变量不能调用参数化构造函数吗?

class counter {
private:
  int value;
public:
  counter() { this->value = 0; }
  counter(int value) { this->value = value; }
};

class A {
  private:
    // works
    counter a;
    // works (since C++11)
    int x = 5; 
    // doesn't work
    counter b(5);
};

int main()
{
// works
counter myCounter;
// works as well
counter mySecondCounter(5);
return 0;
}

最佳答案

如果允许counter b(5); 在技术上声明了一个名为 b 的函数,该函数返回一个 counter对象,并采用一个整数参数。

虽然这很可能不是编码人员的意图,但这就是不允许这样做的原因。

Bjarne 对类内初始化器的这条规则是这样说的:

我们可以在类声明中为非静态数据成员指定一个初始值设定项。例如:

class A {
  public:
    int a {7};
    int b = 77;
};

由于与解析和名称查找相关的相当晦涩的技术原因,{}= 初始值设定项 表示法可用于类内成员初始值设定项,但() 表示法不能。

关于c++ - C++私有(private)区实例变量初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43775959/

相关文章:

c++ - 具有大消息的跨平台 RPC

javascript - 最合适的数据结构是什么? (使用带有间隙的数组是否有缺点或注意事项?)

c# - 在 C# 构造函数中强制显式初始化成员

c++ - 如何使用桶排序对一组字符串进行排序

c++ - 公开不透明 C 结构体中的字段

c++ - 是否有任何预定义函数可以确定字符串是否仅包含数字?

javascript - 获取数组内部的数组

javascript - 在 Object.keys() 上使用 for..in 打印错误的键

haskell - 构造具有多个字段的 Haskell 数据类型

c++ - 类 Bar { 运算符 Foo(); }