《c语言中default的用法.pdf》由会员分享,可在线阅读,更多相关《c语言中default的用法.pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 c 语言中 default 的用法 c 语言中 default 的用法 c 语言中 default 的用法如下:一、类中的默认函数 a.类中默认的成员函数 1.默认构造函数 2.默认析构函数 3.拷贝构造函数 4.拷贝赋值函数 5.移动构造函数 6.移动拷贝函数 b.类中自定义的操作符函数 1.operator 2.operator 3.operator 4.operator*5.operator-6.operator-*7.operator new 8.operator 同时 C+规定,一旦程序员实现了这些函数的自定义版本,则编译器不会再自动生产默认版本。注意只是不自动生成默认版本,当然还
2、是可手动生成默认版本的。当我们自己定义了待参数的构造函数时,我们最好是声明不带参数的版本以完成无参的变量初始化,此时编译是不会再自动提供默认的无参版本了。我们可以通过使用关键字default 来控制默认构造函数的生成,显式地指示编译器生成该函数的默认版本。比如:classMyClass public:MyClass=default;/同时提供默认版本和带参版本,类型是 POD 的 MyClassinti:datai private:int data;有些时候我们希望限制默认函数的生成。典型的是禁止使用拷贝构造函数,以往的做法是将拷贝构造函数声明为private 的并不提供实现,这样当拷贝构造对
3、象时编译不能通过,C+11 则使用关键字显式指示编译器不生成函数的默认版本。比如:classMyClass public:MyClass=default;MyClassconstMyClass .当然,一旦函数被过了,那么重载该函数也是非法的,该函数我们习惯上称为删除函数。二、default 和的其他用途 上面我们已经看到在类中我们可用 default 和修饰成员函数,使之成为缺省函数或者删除函数,在类的外面,default 可以在类定义之外修饰成员函数,比如:classMyClass public:MyClass=default;MyClass operator=constMyClass ;
4、/在类的定义外用 default 来指明缺省函数版本 inlineMyClassMyClass:operator=constMyClass=default;还可以 MyClassMyClass:operator=constMyClass=default;但是这种类外定义合成的成员就不是内联函数。与=default 不同,=必须出现在函数的第一次声明中。因为一个默认的成员只影响为这个成员生成的代码,因此=default 直到编译生成代码时才需要,而编译器必须早早知道一个函数是否是删除的,以便禁止试图使用它的操作。一般情况下,析构函数不能定义为删除的,因为如果析构函数被删除,就无法删除此类型的对象
5、了。对于一个删除了析构函数的类型,编译器将不允许定义该类型的变量或创建该类型的临时对象,而且如果一个类 有某个成员的类型删除了析构函数,也不能定义该类的变量或临时对象,因为一个成员的析构函数是删除的,则该成员无法销毁,包含它的类也就没法销毁。虽然对于删除了析构函数的类型,我们不能定义这种类型的变量或成员但可以动态分配这种类型的对象,比如:StructNoDtor NoDtor=default;NoDtor=default;NoDtor*P=new NoDtor;/正确,但是我能 P 但是有时析构函数也是可以的,这样做的目的是我们在指定内存位置进行内存分配时并不需要析构函数来完成对象级别的清理,
6、这时我们可显示删除析构函数来限制自定义类型在栈上或者静态的构造。关于的显式删除,并非局限于成员函数,比如:voidFuncinti;void Funcchar c=;/显式删除 char 版本 int main Func3;Funcc;/无法编译通过 return 0;这里因为 Func 的 char 版本已经被删除,故 Funcc会编译失败。由此我们也知 default 是只局限作用于类的部分成员函数的。于是我们还可用来避免不必要的隐式数据类型转换。比如:classMyClass public:MyClassinti;MyClssschar c=;/删除 char 版本的构造函数 ;void
7、 FunMyClass m int main Func3;Funca;/编译不能通过 MyClassm13;MyClass m2a;/编译不能通过 这是因为 char 版本的构造函数被删除后,试图从 char 构造 MyClass对象的方式是不允许的了。但去掉这句的函数删除后,编译器会隐式的将a 转换为整型使得编译通过,调用的是整型构造函数,这可能并不是你所想要的。但是如果这样:classMyClass public:MyClassinti;explicit MyClssschar c=;/删除 explicit 的 char 版本的构造函数 ;void FunMyClass m int ma
8、in Func3;Funca;/编译可通过 MyClassm13;MyClass m2a;/编译不能通过 将构造函数 explicit 后,构造函数一样的还是不能发生 char 的构造,因为 char 构造版本被删除了,但在 Func 的调用中,编译器会尝试将 c 转换为 int,即 Funca会调用一次 MyClassint 构造,顺利通过编译。于是我们不提倡 explicit 和混用。对与普通函数也有类型的效果。的用法还包括删除 operator new 操作符,编码在堆上分配该类的对象 如:void*operator newstd:size_t=;合成的拷贝控制成员可能是删除的,如果一个
9、类有数据成员不能默认构造、拷贝、复制或销毁,则对应的成员函数将被定义为删除的。因此:如果类的某个成员的析构函数是删除的或不可访问的,那么类的合成析构函数被定义为删除的。如果类的某个成员的拷贝构造函数是删除的或不可访问的,则类的合成拷贝构造函数也被定义为删除的。如果类的某个成员的拷贝赋值运算符是删除的或不可访问的,或是类有一个 const 的或引用成员,则类的合成拷贝赋值运算符被定义为删除的。如果类的某个成员的析构函数是删除的或不可访问的,或是类有一个 引用成员,它没有类内初始化器,或是类有一个 const 成员,它没有类内初始化器且其类型未显示定义默认构造函数,则该类的默认构造函数被定义为删除的