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

时间:2015-04-10 05:15:17

标签: c++ constructor operator-keyword composition

我正在为书籍练习编写代码,并遇到了一个简单的问题。如果我首先展示这些例子,那将是最好的。

  • 第一堂课: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已经初始化并在头文件中构建......

3 个答案:

答案 0 :(得分:2)

代码:

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

表示firstClass子对象将调用其构造函数,该构造函数需要ab。 <{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类型对象的有效方法。