c++ 删除 类的拷贝和赋值函数
#pragma once #include "include/cef_app.h" class HttpSchemeFactory :public CefSchemeHandlerFactory { public: HttpSchemeFactory() = default; //删除拷贝函数 HttpSchemeFactory(const HttpSchemeFactory&) = delete; //删除赋值函数 HttpSchemeFactory& operator=(const HttpSchemeFactory&) = delete; //处理请求的方法定义 CefRefPtr<CefResourceHandler> Create(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, const CefString& scheme_name, CefRefPtr<CefRequest> request) override; private: IMPLEMENT_REFCOUNTING(HttpSchemeFactory); };
C++ 对象的赋值行为:MyObj myObj1('initStr'); MyObj myObj2; myObj2=myObj1; C++ 对象的拷贝行为:MyObj myObj1('initStr'); MyObj myObj2(myObj1); 在 HttpSchemeFactory 类中,我们通过 delete 关键字阻止了这两种行为。
对于一个 C++ 的类来说,即使开发者没有提供拷贝函数和赋值函数,编译器也会为这个类生成默认的拷贝函数和默认的赋值函数。
编译器的这个行为在大多数情况下是有益的,因为对于一个普通的 C++ 类来说,拷贝和赋值是两项基本的操作,
编译器提供了默认实现,就不需要开发者为这些类撰写相应的代码了。 但有些类涉及到一些资源操作或跨进程异步操作,不希望编译器提供这两种行为的默认实现,
比如: C++ 标准库中的 iostream 类就阻止了拷贝行为,以避免多个对象写入或读取相同的 IO 缓冲。
还有一些类持有的数据特别多,这就会导致拷贝或赋值非常损耗性能,基于这方面的理由,它们也会阻止拷贝和赋值行为。