C ++中的委托构造函数可以在正文中调用还是只在初始化列表中调用?

时间:2015-08-03 14:59:55

标签: c++ c++11

正如标题所说,我很好奇是否可以在正文中调用委托构造函数。

如果你对动机感到好奇: 我有一些条件,只有我发现需要使用uselss写入占用空间的虚拟成员。

#include <iostream>
using namespace std;

struct Delegating {
Delegating (const string& str) {
        cout <<"const string& \n";
}
Delegating(string&& str): dummy_(str.size()>4 ? 0 : (Delegating(str),0))     {
       if (str.size()>4) {
          cout <<"string&& \n";
       }
}
bool dummy_;
};

int main() {
    // your code goes here
    Delegating("abc");
    Delegating("abcde");
    Delegating("abcde");
    Delegating("abcde");
    Delegating("abc");
    cout << "\n--------------------\n";
    Delegating(string("abc"));
    Delegating(string("abcde"));
    Delegating(string("abcde"));
    Delegating(string("abcde"));
    Delegating(string("abcde"));
    Delegating(string("abc"));
    return 0;
}

2 个答案:

答案 0 :(得分:6)

您的代码没有按照您的想法执行。通过添加详细的析构函数:

#!/bin/sh
echo window 
read -p

...输出变为:

~Delegating() {
    std::cout << "~\n";   
}

请注意,有七个析构函数调用,而您只实例化了五个对象。这是因为在以下行中:

const string& 
~
~
string&& 
~
string&& 
~
string&& 
~
const string& 
~
~
--------------------
(and so on)

... Delegating(string&& str): dummy_(str.size()>4 ? 0 : (Delegating(str),0)) { 不是委托构造函数调用,而是一个独立的临时对象,在Delegating(str)初始化期间创建和销毁。

委托构造函数的唯一语法是:

dummy_

...并且无法有条件地委托。你可以使用一个执行检查的静态函数,并返回一个适当构造的对象(a.k.a&#34; Named Constructor Pattern&#34;)。

答案 1 :(得分:1)

其他答案已经指出,如果你从构造函数中调用构造函数,那么你正在创建一个临时的。我想指出,您的测试用例永远不会直接调用构造函数Delegating (const string& str)。在所有这些情况下,Delegating(string && str)更适合。

尝试使用以下使用命名构造函数的代码。

#include <iostream>
using namespace std;


struct Delegating
{
    Delegating()
    {
        cout << "default \n";
    };

    Delegating( const string & str )
    {
        cout << "const string & \n";
    }

    Delegating( const string && str )
    {
        cout << "string && \n";
    }

    static Delegating constr( const string & a_Str )
    {
        cout << a_Str.data() << '\t';
        return Delegating( a_Str );
    }

    static Delegating constr( string && x_Str )
    {
        cout << x_Str.data() << '\t';
        if ( x_Str.size() > 4 )
            return Delegating();
        else
            return Delegating( x_Str );
    }

    ~Delegating()
    {
        cout << "~\n";
    }
};

int main()
{
    {
        Delegating::constr( "abc" );
        Delegating::constr( "abcde" );
        cout << "\n--------------------\n";
        Delegating::constr( string( "abc" ) );
        Delegating::constr( string( "abcde" ) );
        cout << "\n--------------------\n";
        string d_Named( "abc" );
        Delegating::constr( d_Named );
        d_Named = "abcde";
        Delegating::constr( d_Named );
    }
    return 0;
}