禁用copy构造函数

如果你定义一个空类,编译器自动为你做的就是申明四个函数,分别是:

1,构造函数

2,copy构造函数

3,copy assignment构造函数

4,析构函数

比如:

class Moon{}


这是一个空类,然后编译器会为你做的就是像下面这么写:

class Moon{
public:
    // 构造函数
    Moon(){} 
    // 拷贝构造函数
    Moon(const Moon &yueliang){}
    // 复制赋值函数
    Moon &operator=(const Moon &yueliang){}
    // 析够函数
    ~Moon(){}
}

上面的类是Moon,客观真理告诉我们月亮不可能被复制构造另一个,所以对于不能含有复制构造函数的类,在C++中有两种较为标准的写法:

1,定义一个公共基类,继承这个基类就能禁止复制构造,如:

class Celestial{
protected:
    Celestial(){}
    ~Celestial(){}
private:
    Celestial(const Celestial&){}
    Celestial& operator=(const Celestial&){}
}

class Moon:private Celestial{

}

2,创建一个宏,将其放到独一无二的对象的private中:

#define NO_COPY(Typename) Typename(const Typename&); void operator=(const Typename&);

据董的博客所说,第二种方式较好。

此内容为《董的博客》的effective c++部分所理解提成。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当你禁用拷贝构造函数时,你可以使用智能指针来构造 std::vector 的元素。 你可以使用 std::unique_ptr 来保存 vector 中的元素,这样你就可以避免使用拷贝构造函数了。 例如: ``` #include <vector> #include <memory> class MyClass { public: MyClass() {} MyClass(const MyClass&) = delete; // other methods... }; int main() { std::vector<std::unique_ptr<MyClass>> v; v.push_back(std::make_unique<MyClass>()); // other operations... } ``` 这样,你就可以在禁用了拷贝构造函数的情况下使用 std::vector 了。 ### 回答2: C++中的智能指针可以很方便地管理指针资源,其中最常用的智能指针是std::shared_ptr和std::unique_ptr。 禁用了拷贝构造函数的类不能直接作为vector元素,因为vector会在内部执行元素的复制操作。此时,我们可以使用std::unique_ptr智能指针来构造vector元素。 禁用拷贝构造函数的类可以使用std::unique_ptr作为成员变量,将其指向的对象内存资源转移给std::unique_ptr。这样,在将该类对象添加到vector时,可以使用std::make_unique函数来创建std::unique_ptr对象,并将其移动到vector中。 下面是一个示例: ```cpp #include <iostream> #include <memory> #include <vector> class MyClass { public: // 禁用拷贝构造函数 MyClass(const MyClass&) = delete; // 定义移动构造函数 MyClass(MyClass&&) = default; MyClass(int data) : data_(data) {} void printData() { std::cout << "Data: " << data_ << std::endl; } private: int data_; }; int main() { std::vector<std::unique_ptr<MyClass>> vec; vec.push_back(std::make_unique<MyClass>(1)); vec.push_back(std::make_unique<MyClass>(2)); vec.push_back(std::make_unique<MyClass>(3)); for (const auto& ptr : vec) { ptr->printData(); } return 0; } ``` 在上面的示例中,禁用了拷贝构造函数的类`MyClass`使用了std::unique_ptr来管理内存资源,然后通过std::make_unique函数创建std::unique_ptr,并将其移动到了vector容器中。最后,通过循环遍历vector元素,调用类的成员函数进行打印输出。 这样,即使禁用了拷贝构造函数,也可以使用std::unique_ptr智能指针来构造vector元素,实现了对资源的正确管理。 ### 回答3: 禁用拷贝构造函数的类可以使用智能指针构造vector元素,具体方法如下。 智能指针(Smart Pointer)是C++中的一个重要概念,通过它我们可以管理动态分配的内存资源,避免内存泄漏和悬挂指针等问题。在C++标准库中,提供了两种常用的智能指针:shared_ptr和unique_ptr。 首先,由于禁用了拷贝构造函数,因此无法直接通过拷贝构造函数将对象插入vector中。一个简单的解决方法是使用unique_ptr,它的特点是所有权唯一且不可共享。 在向vector中插入元素时,可以使用make_unique函数创建一个unique_ptr,将该指针的所有权交给vector管理,具体示例代码如下: ```cpp #include <iostream> #include <vector> #include <memory> class MyClass { private: int data; public: MyClass(int value) : data(value) {} // 禁用拷贝构造函数 MyClass(const MyClass& other) = delete; // 禁用拷贝赋值运算符 MyClass& operator=(const MyClass& other) = delete; }; int main() { std::vector<std::unique_ptr<MyClass>> myVector; myVector.push_back(std::make_unique<MyClass>(10)); myVector.push_back(std::make_unique<MyClass>(20)); // 输出vector中元素的data值 for (const auto& element : myVector) { std::cout << element->getData() << " "; } return 0; } ``` 以上代码创建了一个名为MyClass的类,禁用了拷贝构造函数。在main函数中,我们使用了std::unique_ptr来保存MyClass的对象,并使用std::make_unique函数创建对象并将其插入到vector中。最后,我们通过for循环打印了vector中元素的data值。 总结来说,禁用拷贝构造函数的类可以使用unique_ptr来构造vector元素,以确保对象的所有权唯一性。这样既保证了按值传递的效果,又避免了复制的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值