gpt4 book ai didi

c++ - 复制构造函数可以接受非常量参数吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:00:08 24 4
gpt4 key购买 nike

我有这个问题,有一个函数foo()如下,

vector<ClassA> vec;

void foo()
{
ClassA a; //inside foo, a ClassA object will be created
a._ptr = new char[10];

vec.push_back(a); //and this newly created ClassA object should be put into vec for later use
}

据我所知,vec 将调用 ClassA 的复制构造函数来复制新创建的对象 a,这里是问题。如果我以通常的方式定义 ClassA 的复制构造函数,

ClassA::ClassA(const ClassA &ra) : _ptr(0)
{
_ptr = ra._ptr;
}

然后对象 a 及其拷贝(由 vec 创建)将有指针 _ptr 指向同一区域,当 foo 完成时, a会调用析构函数释放_ptr,那么avec中的copy就是一个悬垂指针,对吧?由于这个问题,我想以这种方式实现ClassA的copy-ctor,

ClassA::ClassA(ClassA &ra) : _ptr(0) //take non-const reference as parameter
{
std::swap(_ptr, a._ptr);
}

我的实现没问题吗?或者任何其他方式可以帮助完成这项工作?

最佳答案

回答您的名义问题:是的,类的任何构造函数T具有一个 T & 类型的强制参数或 T const & (它可能还有更多的默认参数)是一个复制构造函数。在 C++11 中,还有一个 move 构造函数,它需要一个 T && 类型的参数.

拥有一个实际改变参数的非常量复制构造函数给你的类带来了非常不寻常的语义(通常是“传输语义”)并且应该被广泛记录;它还会阻止您复制常量(显然)。老std::auto_ptr<T>正是这样做的。

如果可能的话,新的 C++11 风格的可变右值引用和移动构造函数为在原始对象中不再需要资源时“移动”资源的问题提供了更好的解决方案。这是因为右值引用是对 mutable 对象的引用,但它只能绑定(bind)到“安全”表达式,例如临时变量或您已显式转换(通过 std::move )并因此标记的事物作为一次性的。

关于c++ - 复制构造函数可以接受非常量参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11683959/

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