c语言中default的用法


2023年12月23日发(作者:斩钉截铁的反义词)

c语言中default的用法

C语言是一门实践性和动手力量要求很高的高校主干课程,但是C语言试验课的教学始终不受重视,教学效果也不太抱负。下面我就跟你们具体介绍下c语言中default的用法,期望对你们有用。

C语言中的switch和default的意思

1.用于多分支选择的switch语句, 其一般形式为: switch(表达式){ case 常量表达式1: 语句1; case 常量表达式2: 语句2; case 常量表达式n: 语句n;

default: 语句n+1;}

是分支语句,就是比较强大的if集;default为不满足全部的switch条件那么后面的〔句子〕被执行。一般将default写在switch中的最终

3.是否要使用deafult

不!但是为了进展错误检查或规律检查,还是应当在switch语句中参与default分支。例如,下述switch语句完全合法:switch (char_code){ case tyt: case y: printf

( You answered YES ! n ) break case N: case n: printf (You answered NO!n); break}但是,假设一个未知字符被传递给这条switch语句,会消灭什么状况呢?这时,程序将没有任何输出。因此,最好还是参与一个default分支,以处理这种状况:......default: printf (Unknown response : %dn, char_code); 此外,default分支能给规律检查带来很多便利。例如,假设用switch语句来处理数目固定的条件,而且认为这些条件之外的值都属于规律错误,那么可以参与一个default分支来辨识规律错误。

c语言中default的用法:类中的默认函数

1 / 4

a.类中默认的成员函数

1.默认构造函数

2.默认析构函数

3.拷贝构造函数

4.拷贝赋值函数

5.移动构造函数

6.移动拷贝函数

b.类中自定义的操作符函数

or

or

or

or*

or-

or-*

or new

or delete

同时C++规定,一旦程序员实现了这些函数的自定义版本,那么编译器不会再自动生产默认版本。留意只是不自动生成默认版本,当然还是可手动生成默认版本的。当我们自己定义了待参数的构造函数时,我们最好是声明不带参数的版本以完成无参的变量初始化,此时编译是不会再自动供应默认的无参版本了。我们可以通过使用关键字default来把握默认构造函数的生成,显式地指示编译器生成该函数的默认版本。比方:

classMyClass

{

public:

MyClass()=default; //同时供应默认版本和带参版本,类型是POD的

MyClass(inti):data(i){}

private:

int data;

};

有些时候我们期望限制默认函数的生成。典型的是制止使用拷贝构造函数,以往的做法是将拷贝构造函数声明为private的并不供应实现,这样当拷贝构造对象时编译不能通过,C++11那么使用delete关键字显式指示编译器不生成函数的默认版本。比方:

classMyClass

{

public:

MyClass()=default;

MyClass(constMyClass )=delete;

......

}

当然,一旦函数被delete过了,那么重载该函数也是非法的,该函数我们习惯上称为删除函数。

c语言中default和delete的其他用途

上面我们已经看到在类中我们可用default和delete修饰成员函数,使之成为缺省函数或者删除函数,在类的外面,default可以在类定义之外修饰成员函数,比方:

classMyClass

{

public:

MyClass()=default;

MyClass() operator=(constMyClass );

);

//在类的定义外用default来指明缺省函数版本

inlineMyClassMyClass::operator=(constMyClass )=default;

还可以MyClassMyClass::operator=(constMyClass )=default;但是这种类外定义合成的成员就不是内联函数。

与=default 不同,=delete必需出如今函数的第一次声明中。由于一个默认的成员只影响为这个成员生成的代码,因此=default 直到编译生成代码时才需要,而编译器必需早早知道一个函数是否是删除的,以便制止试图使用它的操作。

一般状况下,析构函数不能定义为删除的,由于假设析构函数被删除,就无法删除此类型的对象了。对于一个删除了析构函数的类型,编译器将不允许定义该类型的变量或创立该类型的临时对象,而且假设一个类有某个成员的类型删除了析构函数,也不能定义该类的变量或临时对象,由于一个成员的析构函数是删除的,那么该成员无法销毁,包含它的类也就没法销毁。虽然对于删除了析构函数的类型,我们不能定义这种类型的变量或成员但可以动态支配这种类型的对象,2 / 4

比方:

StructNoDtor{

NoDtor()=default;

~NoDtor()=default;

};

NoDtor *P=new NoDtor();//正确,但是我能delete P

但是有时析构函数也是可以delete的,这样做的目的是我们在指定内存位置进展内存支配时并不需要析构函数来完成对象级别的清理,这时我们可显示删除析构函数来限制自定义类型在栈上或者静态的构造。

关于delete的显式删除,并非局限于成员函数,比方:

voidFunc(inti){};

void Func(char c)=delete; //显式删除char版本

int main()

{

Func(3);

Func(c); //无法编译通过

return 0;

}

这里由于Func的char版本已经被删除,故Func(c)会编译失败。由此我们也知default是只局限作用于类的局部成员函数的。于是我们还可用delete来避开不必要的隐式数据类型转换。比方:

classMyClass

{

public:

MyClass(inti){};

MyClsss(char c)=delete; //删除char版本的构造函数

};

void Fun(MyClass m){}

int main()

{

Func(3);

Func(a); //编译不能通过

MyClassm1(3);

MyClass m2(a); //编译不能通过

}

这是由于char版本的构造函数被删除后,试图从char构造MyClass对象的方式是不允许的了。但去掉这句的函数删除后,编译器会隐式的将a转换为整型使得编译通过,调用的是整型构造函数,这可能并不是你所想要的。

但是假设这样:

classMyClass

{

public:

MyClass(inti){};

explicit MyClsss(char c)=delete; //删除explicit的char版本的构造函数

3 / 4

};

void Fun(MyClass m){}

int main()

{

Func(3);

const的或引用成员,那么类的合成拷贝赋值运算符被定义为删除的。

假设类的某个成员的析构函数是删除的或不行访问的,或是类有一个引用成员,它没有类内初始化器,或是类有一个const成员,它没有类内初始化器且其类型未显示定义默认构造函数,那么该类的默认构造函数被定义为删除的

猜你宠爱:

Func(a); //编译可通过

MyClassm1(3);

MyClass m2(a); //编译不能通过

}

将构造函数explicit后,构造函数一样的还是不能发生char的构造,由于char

构造版本被删除了,但在Func的调用中,编译器会尝试将c转换为int,即Func(a)

会调用一次MyClass(int )构造,顺当通过编译。于是我们不提倡explicit和delete

混用。对与一般函数delete也有类型的效果。

delete的用法还包括删除operator new操作符,编码在堆上支配该类的对象

如:void* operator new(std::size_t)=delete;

合成的拷贝把握成员可能是删除的,假设一个类有数据成员不能默认构造、拷贝、复制或销毁,那么对应的成员函数将被定义为删除的。因此:

假设类的某个成员的析构函数是删除的或不行访问的,那么类的合成析构函数被定义为删除的。

假设类的某个成员的拷贝构造函数是删除的或不行访问的,那么类的合成拷贝构造函数也被定义为删除的。

假设类的某个成员的拷贝赋值运算符是删除的或不行访问的,或是类有一个 4 / 4

1.c语言中include的用法

2.c语言的用法总结

3.c中for的用法

4.c语言中规律或的用法

5.c语言中putchar的用法

6.c语言中continue的用法


本文发布于:2024-09-22 17:25:30,感谢您对本站的认可!

本文链接:https://www.17tex.com/fanyi/25987.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:函数   删除   成员   默认   定义   类型
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议