【发布时间】:2020-04-16 03:07:24
【问题描述】:
假设我的班级是这样的:
class Strt {
public:
int a{0};
int b{0};
Strt(int a, int b): a(a), b(b) {}
Strt(Strt& s) {a = s.a; b = s.b;} // these two functions have same contents
Strt(Strt&& s) {a = s.a; b = s.b;}
};
问题是左值初始化和右值初始化是相同的,这使得它不干净,因为一旦我想修改类成员变量,我需要以相同的方式修改这两个函数。代码是重复的。我怎样才能把它清理干净以便更好地阅读和维护?
编辑:
有些场合会调用这些构造函数:
Strt func() {return Strt(1, 2);}
vector<Strt> v;
Strt s(3, 4);
v.push_back(s); // call left construction function
v.emplace_back(func();} // call right construction function
还有一些场合需要修改类,比如我需要在里面添加int c;的新字段:
class Strt {
public:
int a{0};
int b{0};
int c{0};
Strt(int a, int b, int c): a(a), b(b), c(c) {}
Strt(Strt& s) {a = s.a; b = s.b; c = s.c;} // The two functions are duplicatedly modified in the same way
Strt(Strt&& s) {a = s.a; b = s.b; c = s.c;}
};
Strt(Strt&)和Strt(Strt&&)的内容是否相同,我必须分别修改吗?
【问题讨论】:
-
您的问题含糊不清。您能否列出构造函数的期望用法及其预期结果?此外,您可能希望将类和属性重命名为更具解释性的命名约定,这是最佳实践。
-
有用的阅读:The rule of three/five/zero。详细说明何时需要特殊的复制和分配功能以及原因。