以拷贝构造函数、拷贝赋值为例 第一种方法:将其声明为private
class Ty
{
public:
Ty() = default;
private:
Ty(const Ty &o)
{
}
Ty &operator=(const Ty &o)
{
return *this;
}
};
void main()
{
Ty t1;
Ty t2(t1);
system("pause");
}
但是这种方法,不安全,因为成员函数和friend函数还是可以调用的。比如,在类中加入以下函数:
void fun(const Ty &o)
{
*this = o;
Ty temp(o);
}
第二种方法:使用delete 代码如下:
class Ty
{
public:
Ty() = default;
void fun(const Ty &o)
{
*this = o;
Ty temp(o);
}
private:
Ty(const Ty &) = delete;
Ty &operator=(const Ty &) = delete;
};
第三种方式:只声明,不定义
class Ty
{
public:
Ty() = default;
void fun(const Ty &o)
{
*this = o;
Ty temp(o);
}
private:
Ty(const Ty &) ;
Ty &operator=(const Ty &) ;
};
第四种:使用类noncopyable
class nonCoypable
{
protected:
nonCoypable(){}
~nonCoypable(){}
private:
nonCoypable(const nonCoypable &o)
{}
nonCoypable&operator=(const nonCoypable &o)
{
}
};
class A :private nonCoypable
{
public:
A() = default;
};
前提是子类中不去实现public的拷贝构造函数和拷贝赋值构造函数。这样在执行拷贝操作的时候就会去调用父类的拷贝操作,但是父类的拷贝操作是private,所以不能访问。故屏蔽成功。
|