由于您可以在C 中以两种方式声明复制构造函数,这是正确的方式
Since you can declare a copy constructor in two ways in C++ which is the right way?
说您有以下类:
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
- 请描述一下在 c++ 中在此类中定义构造函数的方式?
- 用初始化列表和超类构造函数声明子类构造函数的正确方式
- 以支持继承的方式将自身shared_ptr添加到对象构造函数中的向量中
- 不同的构造函数方式
- 在C 中超负荷构造函数的合适方式是什么
- 矩阵类编写构造函数,解构器和复制构造函数的方式
- 由于您可以在C 中以两种方式声明复制构造函数,这是正确的方式
- 如何使用构造函数以类似的方式初始化"对象数组"
- 构造函数的快捷方式
- 编写有条件可选构造函数的最佳方式
- 定义构造函数的两种不同方式
- 复制构造函数快捷方式
- 以不同方式实现可变参数构造函数的模板类:每个版本的优点和缺点是什么
- RAII 在两个构造函数之间进行选择的方式
- 如果在构造函数中使用宏,它可以以不同的方式扩展吗?
- 继承顺序C++以何种方式影响构造函数
- 转换构造函数的实际工作方式
- 将指针/引用传递到构造函数中现有对象的首选方式是什么
- 以最紧凑的方式调用默认(AKA无参数)构造函数
- 子类如何调用以不同方式初始化成员变量的父类的构造函数?[C++]