繁体   English   中英

每次调用默认构造函数时都会调用复制构造函数吗?

[英]Copy constructor called everytime a default constructor is called?

碰到这个问题时,我正在研究有关构造函数初始化列表的一些问题。

考虑一下:

class Student {
    public:
        Student() {
            id = 0;
        }
        Student(int i) {
            id = i;
        }
    private:
        int id;
};

现在,检查一下:

当您进入构造函数的主体时,所有字段都已被构造; 如果它们具有默认构造函数,则这些构造函数已被调用。 现在,如果您在构造函数的主体中为其分配值,则您正在调用复制构造函数。 这是低效的,因为最终调用了两个构造函数而不是一个。

来源: C ++构造函数名称后面的冒号有什么作用?

那么,这是否意味着当我调用无参数构造函数时,也会同时调用复制构造函数?

请解释。 这真是令人困惑。

特别是第一行的含义:

当您进入构造函数的主体时,所有字段都已经被构造

这意味着int id在到达id = 0之前已经被初始化。 由于未指定任何显式初始化程序,因此已默认初始化。 另外,因为它是一个int ,所以初始化规则告诉使用它将具有一些不确定的值。

在实践中,对于int或任何初始化起来非常便宜的类型,这没什么大不了的。

如果我们使用类而不是使用int成员,则可以更清楚地了解幕后的实际情况:

#include <iostream>

class Verbose {
    public:
        Verbose() {
            std::cout << __PRETTY_FUNCTION__ << "\n";
        }

        Verbose(int) {
            std::cout << __PRETTY_FUNCTION__ << "\n";
        }

        Verbose(Verbose const &) {
            std::cout << __PRETTY_FUNCTION__ << "\n";
        }

        Verbose & operator=(Verbose const &) {
            std::cout << __PRETTY_FUNCTION__ << "\n";
            return *this;
        }

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

class Object {
    public:
        Verbose v;

        Object() {
            v = Verbose(3);
        }
};

int main() {
    Object o;
}

此代码将输出:

Verbose::Verbose()
Verbose::Verbose(int)
Verbose &Verbose::operator=(const Verbose &)
Verbose::~Verbose()
Verbose::~Verbose()

请注意,我们:

  1. 我们使用默认构造函数创建v
  2. 我们创建一个临时Verbose(3)
  3. 然后,我们使用赋值运算符将临时变量赋给成员变量。
  4. 然后,我们销毁临时站点。
  5. Object o超出范围时,我们然后销毁成员变量。

请注意,我们基本上构造了两次Verbose v 我们首先使用默认的构造函数,然后基本上使用operator=调用对其进行重建。 如果使用初始化列表 ,则可以将其减少为对Verbose(int)一次调用。

他们的意思是

Student() {
    id = 0;
}

效率不如

Student() : id(0) {}

在此特定示例中,由于成员只是一个int ,因此将在单个步骤中初始化id

相反,如果Student具有更多复杂的成员(例如BackpackBooks ,则后一种方法将有所作为。 如果这些类不是POD,则第一个方法将花费两步来初始化成员,而第二个方法将只花费一个步来初始化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM