C++禁止使用拷贝构造函数和赋值运算符方法

本文介绍如何在C++11中通过声明拷贝构造函数和赋值运算符为私有并使用delete关键字,来防止类被复制。此外还展示了如何使用delete关键字来限制函数的某些参数类型及在模板特例化中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1.将拷贝构造函数和赋值运算符声明为私有,并不予实现

复制代码
class Uncopyable  
{  
private:  
    Uncopyable(const Uncopyable &); // 阻止copying  
    Uncopyable &operator=(const Uncopyable &);  
};  
复制代码

2.使用delete

 C++11 中,可在想要 “禁止使用” 的特殊成员函数声明后加 “= delete

复制代码
class Uncopyable  
{  

    Uncopyable(const Uncopyable &) =delete; // 阻止copying  
    Uncopyable &operator=(const Uncopyable &)=delete;  
};  

C++11 中,delete 关键字可用于任何函数,不仅仅局限于类成员函数

  在函数重载中,可用 delete 来滤掉一些函数的形参类型,如下:

bool IsLucky(int number);        // original function
bool IsLucky(char) = delete;     // reject chars
bool IsLucky(bool) = delete;     // reject bools
bool IsLucky(double) = delete;   // reject doubles and floats

  这样在调用 IsLucky 函数时,如果参数类型不对,则会出现错误提示

if (IsLucky('a')) …     // error !    call to deleted function
if (IsLucky(true)) …    // error !
if (IsLucky(3.5)) …     // error !


 在模板特例化中,也可以用 delete 来过滤一些特定的形参类型。

  例如,Widget 类中声明了一个模板函数,当进行模板特化时,要求禁止参数为 void* 的函数调用。

  如果按照 C++98 的 “私有不实现“ 思路,应该是将特例化的函数声明为私有型,如下所示:

复制代码
class Widget {
public:
    template<typename T>
    void ProcessPointer(T* ptr) { … }
private:
    template<>             
    void ProcessPointer<void>(void*);    // error!
};
复制代码

  问题是,模板特化应该被写在命名空间域 (namespace scope),而不是类域 (class scope),因此,该方法会报错。

  而在 C++11 中,因为有了 delete 关键字,则可以直接在类域外,将特例化的模板函数声明为 delete, 如下所示:

复制代码
class Widget {
public:
    template<typename T>
    void ProcessPointer(T* ptr) { … }
};

template<> 
void Widget::ProcessPointer<void>(void*) = delete; // still public, but deleted
复制代码

  这样,当程序代码中,有调用 void* 作形参的 ProcessPointer 函数时,则编译时就会报错。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值