gpt4 book ai didi

c++ - "Almost default"C++ 中的复制构造函数(和赋值运算符)

转载 作者:可可西里 更新时间:2023-11-01 16:36:53 26 4
gpt4 key购买 nike

我发现自己经常做的一件事情是制作“几乎默认”的复制构造函数和赋值运算符。也就是说,我发现自己处于编译器提供的复制和赋值运算符适用于大多数数据成员的情况,但有一个特定的数据成员需要以不同方式处理。这意味着我必须显式创建复制构造函数/赋值运算符,包括显式列出所有具有简单复制语义的数据成员。对于有大量数据成员的类,或者稍后添加成员变量但未添加到复制构造函数/赋值运算符的类,这可能会很烦人。

有没有什么方法可以告诉 C++ 编译器显式声明的复制构造函数/赋值运算符应该像隐式声明的一样工作,除了之后运行的一些额外代码? (并且这样的语法是否兼容C++98,或者它是否需要C++11或C++14支持?)

最佳答案

如果您可以按照 Igor Tandetnik 的建议在适当的 RAII 包装器中隔离特定处理:那就去做吧。

如果你还需要在拷贝构造函数和/或赋值运算符中进行特定的处理(比如将对象的创建/赋值注册到容器或日志中),你可以将可以默认拷贝构造/赋值的数据成员分组到一个您用作基类或数据成员的单独类,您将其作为组合处理,因此:

struct x_base {
int a,b,c,d;
std::string name;
};

struct x : x_base {
x(const x& other)
: x_base(other)
{
descr = "copied ";
descr += name;
descr += " at ";
descr += CurrentTimeAsString();
std::cout << descr << "\n";
}
void operator = (const x& other)
{
x_base::operator =(other);
descr = "assigned ";
descr += name;
descr += " at ";
descr += CurrentTimeAsString();
std::cout << descr << "\n";
}
std::string descr;
};

当您稍后添加不需要特定处理的数据成员时,您可以简单地将它们添加到 x_base。

关于c++ - "Almost default"C++ 中的复制构造函数(和赋值运算符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24708101/

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