简介
本文主要用于介绍编译器帮我们默默的编写了哪些函数以及当我们不需要这些函数的时候,应该如何禁止编译器帮我们编写这些函数。
本文是在阅读《c++ primer》和《Effective c++》的总结,所以部分内容可能会与书中的相同
在阅读本章之前,请先阅读C++中编译器默默生成的函数
C++如何禁止编译器生成某些函数
对于某些类而言,对象的拷贝或赋值时不合法的,例如定义了一个学生类,但对于学生对象而言,只能有一个,世界上不存在两个一样的学生对象,我们应该明确阻止学生对象之间的拷贝或赋值,也就是说学生类是不支持拷贝或赋值的。
存在很多中方法来阻止 拷贝构造函数及拷贝赋值运算符的生成,下面主要介绍三种:
- 在C++11标准下,将这些函数声明为删除的函数,在函数参数的后面加上=delete来指示出我们定义的删除的函数
- 将这些函数声明为private,并且不提供函数定义
- 将待定义的类成为一个不支持copy的类的子类
例程
#include <iostream>
// 方法一
class Test {
public:
Test() = default; // use the default constructor
Test(const Test&) = delete;
Test& operator=(const Test&) = delete;
int value = 10;
};
//方法二
class NoCopy {
public:
NoCopy() = default;
int value = 10;
private:
NoCopy(const NoCopy&);
NoCopy& operator=(const NoCopy&);
};
// 方法三
//boost/noncopyable缩减版
class noncopyable
{
protected:
noncopyable() = default;
~noncopyable() = default;
noncopyable(const noncopyable&) = delete;
noncopyable& operator=(const noncopyable&) = delete;
};
class nocopy :noncopyable //默认继承方式为私有继承
{
//...
};
int main()
{
Test test; // default constructor
//[Error]:function "Test::Test(Test &)" cannot be referenced -- it is a deleted function
//Test test2(test); // copy constructor
//std::cout <<"test2.value: " <<test2.value << std::endl;
//test2.value = 300;
//[Error]:function "Test::operator=(Test &)" cannot be referenced -- it is a deleted function
//test = test2; // copy assignment
std::cout <<"test.value: " <<test.value << std::endl;
return 0;
}
//输出:
test.value: 10