在这个例子中,使用C++赋值运算符而不是复制构造函数?

Bil*_*ter 1 c++

作为尝试升级我的C++技能的持续过程的一部分,我试图打破一些旧的习惯.我的老学校C程序员倾向于写这个;

void func( Widget &ref )
{
    Widget w;  // default constructor
    int i;
    for( i=0; i<10; i++ )
    {
        w = ref;  // assignment operator 
        // do stuff that modifies w
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好用.但我认为以下内容更接近最佳实践;

void func( Widget &ref )
{
    for( int i=0; i<10; i++ )
    {
        Widget w = ref; // ??
        // do stuff that modifies w
    }
}
Run Code Online (Sandbox Code Playgroud)

至少使用我的Widget类,这很好用.但我不完全明白为什么.我有两个理论;

1)复制构造函数运行10次.
2)复制构造函数运行一次,然后赋值运算符运行9次.

这些都让我有点麻烦.2)特别是看似人为和错误.我错过了第三种可能性吗?

Jam*_*lis 9

你的第一个理论是正确的:复制构造函数被调用十次.这个:

Widget w = ref;
Run Code Online (Sandbox Code Playgroud)

是(几乎)相同:

Widget w(ref);
Run Code Online (Sandbox Code Playgroud)

第一种叫做复制初始化 ; 第二种叫做直接初始化.两者都调用复制构造函数.两者之间的主要区别在于,如果声明了复制构造函数,则第一个是无效的explicit,而只要存在可访问的复制构造函数,第二个是有效的.

您可以通过声明和定义复制构造函数和复制赋值运算符来验证这一点Widget,并查看每个函数的调用次数.