由于您可以在C 中以两种方式声明复制构造函数,这是正确的方式

Since you can declare a copy constructor in two ways in C++ which is the right way?

本文关键字:方式 构造函数 声明 于您可 两种 复制      更新时间:2023-10-16

说您有以下类:

class Person{
    string name;
    int age;
    int niNo;
public:
    Person(const string & _name, const int & _age, const int & ni) : name(_name), age(_age), niNo(ni) {}
    string getName() const{
        return name;
    }
    int getAge() const{
        return age;
    }
    int getNi() const{
        return niNo;
    }
    bool operator==(const Person &p){
        return name == p.getName() && age == p.getAge() && niNo == p.getNi();
    }

然后您可以按以下方式定义复制构造函数:

    Person (const Person &other){
        name = other.name;
        age = other.age;
        niNo = other.age;
    }

或喜欢这个

    Person (const Person &other) : name(other.getName()), age(other.getAge()), niNo(other.getNi()) {}

哪种是最好的方法?还是无关紧要?

由于您的同类是可以构造的,因此最好的方法是在C 11中:

Person (const Person &other) = default;

否则,第二个是他更好,因为没有像第一个的默认初始化和感情。

您描述的两种方式,我强烈建议使用initializer列表。

当控件进入构造函数时,标准规定当时该对象已完全初始化,因此也必须初始化其所有成员。您的第一个示例是,它以某种默认方式初始化所有成员,然后稍后分配给它们。

,如果一个班级成员是一个巨大的对象,那么如果没有参数,就无法初始化成员,i。e。成员是const,参考或没有默认构造函数的类。

在这种情况下,您必须使用初始化列表来自定义初始化过程。初始化列表语法也可用于委派构造(C 11)并初始化基类。

第二个更有效。在第一个中,成员name首先默认构建然后分配。

一般(不仅仅是复制构造函数),最好直接在初始分配器列表中初始化成员,就像您的第二个示例一样。第一个示例默认限制了它们,然后重新分配它们。这可能是效率较低的,并且对所有类型都不适用:它要求它们是默认的initialisisisis和compy-sapsignation,而直接初始化则不适用。

在这种情况下,您只需要一个简单的会员副本,就不要声明复制构造函数。隐式生成的人会做正确的事情,并且会较少易于错误,因为如果添加新成员,它不需要更新。

要添加的一个重要方面。如果您的私人数据成员之一是const,则例如name

class Person{
   const string name;
    int age;
    int niNo;
...

您没有选项,必须在"构造函数初始器"列表中初始化名称!

如果它是恒定的,则在输入构造函数之前已经构造了默认,并且您不能以恒定的形式重新定义它...因此,您必须使用initializer list