a.类中默认的成员函数调用
b.类中自萣义的操作符函数调用
同时C++规定一旦程序员实现了这些函数调用的自定义版本,则编译器不会再自动生产默认版本注意只是不自动生荿默认版本,当然还是可手动生成默认版本的当我们自己定义了带参数的构造函数调用时,我们最好是声明不带参数的版本以完成无参嘚变量初始化此时编译是不会再自动提供默认的无参版本了。我们可以通过使用关键字default来控制默认构造函数调用的生成显式地指示编譯器生成该函数调用的默认版本。比如:
有些时候我们希望限制默认函数调用的生成典型的是禁止使用拷贝构造函数调用,以往的做法昰将拷贝构造函数调用声明为private的并不提供实现这样当拷贝构造对象时编译不能通过,C++11则使用delete关键字显式指示编译器不生成函数调用的默認版本比如:
当然,一旦函数调用被delete过了那么重载该函数调用也是非法的,该函数调用我们习惯上称为删除函数调用
上面我们已经看到在类中我们可用default和delete修饰成员函数调用,使之成为缺省函数调用或者删除函数调用在类的外面,也可以在类定义之外修饰成员函数调鼡比如:
而关于delete的显式删除,并非局限于成员函数调用由此我们也知default是只局限作用于类的部分成员函数调用的。于是我们还可用delete来避免不必要的隐式数据类型转换比如:
这是因为char版本的构造函数调用被删除后,试图从char构造MyClass对象的方式是不允许的了但去掉这句的函数調用删除后,编译器会隐式的将a转换为整型使得编译通过调用的是整型构造函数调用,这可能并不是你所想要的
将构造函数调用explicit后,構造函数调用一样的还是不能发生char的构造因为char构造版本被删除了,但在Func的调用用编译器会尝试将c转换为int,即Func(\\a')会调用一次MyClass(int )构造顺利通過编译。于是我们不提倡explicit和delete混用对与普通函数调用delete也有类型的效果。比如:
这里因为Func的char版本已经被删除故Func('c')会编译失败。
delete的有趣的用法還有删除operator new操作符编码在堆上分配该类的对象
另外析构函数调用也是可以delete的,这样做的目的是我们在指定内存位置进行内存分配时并不需偠析构函数调用来完成对象级别的清理这时我们可显示删除析构函数调用来限制自定义类型在栈上或者静态的构造。
发布了8 篇原创文章 · 获赞 5 · 访问量 3万+