gpt4 book ai didi

c++ - 我怎样才能写出干净利落的c++构造函数?

转载 作者:行者123 更新时间:2023-12-01 15:13:15 26 4
gpt4 key购买 nike

假设我的类(class)是这样的:

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&&)即使它们具有相同的内容,也要分开?

最佳答案

由于您的类不拥有任何可移动资源,因此没有理由创建单独的复制和移动构造函数。单个复制构造函数将执行相同的操作:

class Strt {
public:
int a{0};
int b{0};

Strt(int a, int b): a(a), b(b) {}
Strt(const Strt& s): a(s.a), b(s.b) {}
};

Live Demo

当然,由于您的复制构造函数除了按成员复制之外什么都不做,您可以省略它并让编译器为您生成默认的:
class Strt {
public:
int a{0};
int b{0};

Strt(int a, int b): a(a), b(b) {}
};

Live Demo

由于 ab都是公共(public)的,除了从构造函数参数初始化它们之外什么都不做,你可以完全省略你的构造函数并使用聚合初始化:
class Strt {
public:
int a{0};
int b{0};
};

Live Demo

关于c++ - 我怎样才能写出干净利落的c++构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61242016/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com