话题:如何禁止类对象不能被拷贝构造和拷贝赋值呢?
目前知道的方法有3种:
(1)使用=delete
class A
{
public:
A(int a = 10):m_i(a) {};
A(const A& obj) = delete;
A& operator=(const A& obj) = delete;
public:
int m_i;
};
A a;
A b = a;//不可以
b = a;//不可以
(2)使用private
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
using namespace std;
class A
{
private:
A(const A& obj) = delete;
A& operator=(const A& obj) = delete;
public:
A(int a = 10) :m_i(a) {};
int m_i;
};
int main()
{
A a;
A b = a;//不可以
b = a;//不可以
return 0;
}
//但是使用private还是有弊端的,例如:
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
using namespace std;
class A
{
private:
A(const A& obj) { cout << "A(const A& obj)" << endl; };
A& operator=(const A& obj) { cout << "A& operator=(const A& obj)" << endl; return *this; };
public:
A(int a = 10) :m_i(a) {};
int m_i;
void fun(const A &obj)
{
*this = obj;//调用拷贝构造函数
A a1 = obj;//调用拷贝赋值运算符
}
};
int main()
{
A a;
A b;
a.fun(b);//一样会调用拷贝构造函数和拷贝赋值运算符
return 0;
}
//显然,使用private还是可以使用拷贝构造函数和拷贝赋值运算符。
(3)借助另一个类
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
using namespace std;
class A
{
private:
A(const A& obj) { cout << "A(const A& obj)" << endl; };
A& operator=(const A& obj) { cout << "A& operator=(const A& obj)" << endl; return *this; };
public:
A(int a = 10) :m_i(a) {};
int m_i;
};
class B :private A //借助类A,这时类B实现不了拷贝构造和拷贝赋值了
{
public:
B() { };
~B() { };
};
int main()
{
B b1;
//B b2 = b1;不可以
//b2 = b1;不可以
return 0;
}