C++构造函数的default和delete
转自:https://blog.csdn.net/u010591680/article/details/71101737
C++11中,当类中含有不能默认初始化的成员变量时,可以禁止默认构造函数的生成,
myClass()=delete;//表示删除默认构造函数
myClass()=default;//表示默认存在构造函数
当类中含有不能默认拷贝成员变量时,可以禁止默认构造函数的生成,
myClass(const myClass&)=delete;//表示删除默认拷贝构造函数,即不能进行默认拷贝
myClass & operatir=(const myClass&)=delete;//表示删除默认拷贝构造函数,即不能进行默认拷贝
——————————————————————————————————————————————————————
转自:https://blog.csdn.net/u012333003/article/details/25299939
同时C++规定,一旦程序员实现了这些函数的自定义版本,则编译器不会再自动生产默认版本。注意只是不自动生成默认版本,当然还是可手动生成默认版本的。当我们自己定义了待参数的构造函数时,我们最好是声明不带参数的版本以完成无参的变量初始化,此时编译是不会再自动提供默认的无参版本了。我们可以通过使用关键字default来控制默认构造函数的生成,显式地指示编译器生成该函数的默认版本。比如:
class MyClass { public: MyClass()=default; //同时提供默认版本和带参版本,类型是POD的 MyClass(int i):data(i){} private: int data; };
有些时候我们希望限制默认函数的生成。典型的是禁止使用拷贝构造函数,以往的做法是将拷贝构造函数声明为private的并不提供实现,这样当拷贝构造对象时编译不能通过,C++11则使用delete关键字显式指示编译器不生成函数的默认版本。比如:
class MyClass { public: MyClass()=default; MyClass(const MyClass& )=delete; ...... }
当然,一旦函数被delete过了,那么重载该函数也是非法的,该函数我们习惯上称为删除函数。
二、default和delete的其他用途
上面我们已经看到在类中我们可用default和delete修饰成员函数,使之成为缺省函数或者删除函数,在类的外面,也可以在类定义之外修饰成员函数,比如:
class MyClass { public: MyClass()=default; MyClass() &operator=(const MyClass& ); ); //在类的定义外用default来指明缺省函数版本 inline MyClass& MyClass::operator=(const MyClass& )=default;
而关于delete的显式删除,并非局限于成员函数,由此我们也知default是只局限作用于类的部分成员函数的。于是我们还可用delete来避免不必要的隐式数据类型转换。比如:
class MyClass { public: MyClass(int i){}; MyClsss(char c)=delete; //删除char版本的构造函数 }; void Fun(MyClass m){} int main() { Func(3); Func('a'); //编译不能通过 MyClass m1(3); MyClass m2('a'); //编译不能通过 }
这是因为char版本的构造函数被删除后,试图从char构造MyClass对象的方式是不允许的了。但去掉这句的函数删除后,编译器会隐式的将a转换为整型使得编译通过,调用的是整型构造函数,这可能并不是你所想要的。但是如果这样:
class MyClass { public: MyClass(int i){}; explicit MyClsss(char c)=delete; //删除explicit的char版本的构造函数 }; void Fun(MyClass m){} int main() { Func(3); Func('a'); //编译可通过 MyClass m1(3); MyClass m2('a'); //编译不能通过 }
将构造函数explicit后,构造函数一样的还是不能发生char的构造,因为char构造版本被删除了,但在Func的调用用,编译器会尝试将c转换为int,即Func(\\a')会调用一次MyClass(int )构造,顺利通过编译。于是我们不提倡explicit和delete混用。
对与普通函数delete也有类型的效果。比如:
void Func(int i){}; void Func(char c)=delete; //显式删除char版本 int main() { Func(3); Func('c); //无法编译通过 return 0; }
这里因为Func的char版本已经被删除,故Func('c')会编译失败。
delete的有趣的用法还有删除operator new操作符,编码在堆上分配该类的对象如:
void* operator new(std::size_t)=delete;
另外析构函数也是可以delete的
这样做的目的是我们在指定内存位置进行内存分配时并不需要析构函数来完成对象级别的清理,这时我们可显示删除析构函数来限制自定义类型在栈上或者静态的构造。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
自动化瓦力多渠道打包python脚本
自动化瓦力多渠道打包python脚本 目录介绍 1.本库优势亮点 2.使用介绍 3.注意要点 4.效果展示 5.其他介绍 0.首先看看我录制的案例演示 如下所示,这段python代码很简单,工具十分强大,一键多渠道打包工具。 项目的开源地址:https://github.com/yangchong211/YCWalleHelper 1.本库优势亮点 通过该自动化脚本,自需要run一下或者命令行运行脚本即可实现美团瓦力多渠道打包,打包速度很快 配置信息十分简单,代码中已经注释十分详细。Keystore信息一定要配置,至于渠道apk输出路径,文件配置路径等均有默认路径,没有配置也没关系 针对输出路径是根目录下的output文件夹,文件不存在则创建,文件存在则是先删除之前多渠道打包生成的【也就是删除output文件夹下所有文件】,然后在重新生成 多渠道的定义是在channel这个文件中,建议是txt文件格式,你可以根据项目情况修改,十分快捷 如果瓦力打包工具更新了,直接替换一下lib中的jar即可。可以在python3.x上跑起来! 我也参考了大量的博客,网上博客很多,我始终觉得对于这种实操...
- 下一篇
pyhanlp 繁简转换,拼音转换与字符正则化
繁简转换HanLP几乎实现了所有我们需要的繁简转换方式,并且已经封装到了HanLP中,使得我们可以轻松的使用,而分词器中已经默认支持多种繁简格式或者混合。这里我们不再做过多描述。 说明HanLP能够识别简繁分歧词,比如打印机=印表機。许多简繁转换工具不能区分“以后”“皇后”中的两个“后”字,HanLP可以。算法详解《汉字转拼音与简繁转换的Java实现》汉字转拼音HanLP中的汉字转拼音功能也十分的强大。 说明HanLP不仅支持基础的汉字转拼音,还支持声母、韵母、音调、音标和输入法首字母首声母功能。HanLP能够识别多音字,也能给繁体中文注拼音。最重要的是,HanLP采用的模式匹配升级到AhoCorasickDoubleArrayTrie,性能大幅提升,能够提供毫秒级的响应速度!算法详解《汉字转拼音与简繁转换的Java实现》拼音转中文HanLP中的数据结构和接口是灵活的,组合这些接口,可以自己创造新功能,我们可以使用AhoCorasickDoubleArrayTrie实现的最长分词器,需要用户调用setTrie()提供一个AhoCorasickDoubleArrayTrie字符正则化演示...
相关文章
文章评论
共有0条评论来说两句吧...