我正在为书籍练习编写代码,并遇到了一个简单的问题。如果我首先展示这些例子,那将是最好的。
第一堂课:fClass heaader
class fClass
{
public:
explicit fClass( int = 0, int = 0 );
fClass& operator()( int, int );
void print();
private:
int x;
int y;
}
第一课:fClass cpp
fClass::fClass( int a, int b )
: x(a), y(b)
{
}
fClass& fClass::operator()( int a, int b )
{
x = a;
y = b;
}
void fClass::print()
{
cout << "x: " << x << "\ny: " << y << endl;
}
第二课,sClass.h
class sClass
{
public:
explicit sClass( int = 0, int = 0 );
void print();
private:
fClass firstClass;
}
第二课,sClass.cpp
sClass::sClass( int a, int b )
: firstClass( a, b )
{
}
void sClass::print()
{
firstClass.print();
}
主要功能
int main()
{
sClass secondClass( 1, 2 );
secondClass.print();
}
现在我的问题是我在fClass中删除了operator()函数。代码仍然有效!据我所知,明确的&#39;声明fClass的构造函数应该在其构造函数(firstClass(a,b))中禁止sClass的fClass定义,因为fClass已经在私有成员声明中明确定义。因此,要在sClass中将其重新初始化为firstClass(a,b),应定义operator function()(就像我一样)。为什么这段代码在没有operator()定义的情况下工作?
根据我的理解,在我的问题上添加更多评论,声明&#39; firstClass(a,b)&#39;不应该调用fClass的显式构造函数,因为它不是第一次初始化。同样,根据我的理解,在首次初始化类以构造类时调用构造函数。 firstClass已经初始化并在头文件中构建......
答案 0 :(得分:2)
代码:
sClass::sClass( int a, int b )
: firstClass( a, b )
表示firstClass
子对象将调用其构造函数,该构造函数需要a
和b
。 <{1}}构造函数被考虑用于此用途,而explicit
则不相关。
您的代码不会在任何地方调用operator()
,因此删除它没有任何区别也就不足为奇了。当在表达式中使用变量名称时使用该运算符,后跟括号。
答案 1 :(得分:0)
关键字explicit
仅防止通过将对象传递给函数来转换对象的情况。你的不是这种情况。我不知道operator()
重载应该在哪里产生任何影响,也许如果你给出了声明这个的文本的URL,那么这里的人可以为你解读真正的意义(或缺乏)。
答案 2 :(得分:0)
您对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);
你说:
据我所知,
explicit
构造函数的fClass
声明应禁止sClass
fClass
在其构造函数中定义firstClass( a, b )
因为fClass
已经在私有成员声明中明确定义了。
您的理解不正确。
该行
fClass firstClass;
类sClass
的定义中的只是说该类有一个名为firstClass
的成员变量,其类型为fClass
。当构造sClass
的对象时,它不会设置变量的值。
在sClass
的构造函数的定义中,您使用: firstClass( a, b )
初始化成员,这是正确的做法。如果您跳过它,该成员将被初始化,就像您使用:firstClass()
一样,这是初始化fClass
类型对象的有效方法。