C++ Class 组合:构造函数?或 () 运算符?

C++ Class Composition: Constructor? or ()operator?

我正在为一个书本练习编写代码,运行变成一个简单的问题。我最好先展示例子。

现在我的问题是我什么时候删除了fClass中的operator()函数。代码仍然有效!据我了解,fClass 构造函数的 'explicit' 声明应禁止在其构造函数 (firstClass( a, b )) 中定义 sClass 的 fClass,因为 fClass 已在私有成员声明中明确定义。因此,要在 sClass 中将其重新初始化为 firstClass( a, b ),应该定义 operator function () (就像我所做的那样)。为什么这段代码可以在没有 operator() 定义的情况下工作?

补充一下我的问题,根据我的理解,语句'firstClass( a, b )'不应该调用fClass的显式构造函数,因为它不是第一次初始化。同样,据我了解,当 class 首次初始化以构造 class 时,将调用构造函数。 firstClass 已经在头文件中初始化和构造...

关键字 explicit 仅防止对象可以通过将其传递给函数来转换的情况。你的情况并非如此。我不知道 operator() 重载应该在哪里产生任何影响,也许如果您将 URL 提供给声明此内容的文本,这里的人们可以为您破译真正的含义(或缺乏真正的含义)。

代码:

sClass::sClass( int a, int b )
    : firstClass( a, b )

意味着 firstClass 子对象将调用其构造函数,该构造函数采用 abexplicit 构造函数被认为是这种用法,operator() 是无关的。

您的代码不会在任何地方调用 operator(),因此删除它没有任何区别也就不足为奇了。当在表达式中使用变量名称后跟圆括号时,将使用该运算符。

您对 explicit 关键字和 operator() 函数感到困惑。

关键字 explicit 可防止调用构造函数来隐式构造对象。简单例子:

假设有一个函数:

void foo(fClass obj) {...}

没有 explicit 关键字,您将能够使用语法调用该函数:

foo({1, 2});

参数 {1,2} 将用于调用构造函数,结果对象将传递给 foo

使用 explicit 关键字,您将无法使用它。您必须使用:

foo(fClass{1, 2});

foo(fClass(1, 2));

operator()函数与explicit关键字和对象构造无关。它只是意味着,您可以使用:

fClass obj(1, 2);
obj(10, 20);

你说:

As I understand the explicit declaration of fClass's constructor should prohibit sClass's fClass definition in its constructor (firstClass( a, b )) because fClass was already explicitly defined in private member declaration.

你的理解不正确。

fClass firstClass;

在class的定义中sClass只是说class有一个名为firstClass的成员变量,它的类型是fClass。构造sClass的对象时不设置变量的值。

sClass 的构造函数的定义中,您正在使用 : firstClass( a, b ) 初始化成员,这是正确的做法。如果您跳过它,成员将被初始化,就像您使用 :firstClass() 一样,这是初始化类型 fClass.

对象的有效方法