C++ Class 组合:构造函数?或 () 运算符?
C++ Class Composition: Constructor? or ()operator?
我正在为一个书本练习编写代码,运行变成一个简单的问题。我最好先展示例子。
第一个class:fClass头
class fClass
{
public:
explicit fClass( int = 0, int = 0 );
fClass& operator()( int, int );
void print();
private:
int x;
int y;
}
首先class: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;
}
第二个class,sClass.h
class sClass
{
public:
explicit sClass( int = 0, int = 0 );
void print();
private:
fClass firstClass;
}
第二个class,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()函数。代码仍然有效!据我了解,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
子对象将调用其构造函数,该构造函数采用 a
和 b
。 explicit
构造函数被认为是这种用法,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
.
对象的有效方法
我正在为一个书本练习编写代码,运行变成一个简单的问题。我最好先展示例子。
第一个class:fClass头
class fClass { public: explicit fClass( int = 0, int = 0 ); fClass& operator()( int, int ); void print(); private: int x; int y; }
首先class: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; }
第二个class,sClass.h
class sClass { public: explicit sClass( int = 0, int = 0 ); void print(); private: fClass firstClass; }
第二个class,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()函数。代码仍然有效!据我了解,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
子对象将调用其构造函数,该构造函数采用 a
和 b
。 explicit
构造函数被认为是这种用法,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 offClass
's constructor should prohibitsClass
'sfClass
definition in its constructor (firstClass( a, b )
) becausefClass
was already explicitly defined in private member declaration.
你的理解不正确。
行
fClass firstClass;
在class的定义中sClass
只是说class有一个名为firstClass
的成员变量,它的类型是fClass
。构造sClass
的对象时不设置变量的值。
在 sClass
的构造函数的定义中,您正在使用 : firstClass( a, b )
初始化成员,这是正确的做法。如果您跳过它,成员将被初始化,就像您使用 :firstClass()
一样,这是初始化类型 fClass
.