C++中explicit关键字的作用
- 格式:docx
- 大小:18.31 KB
- 文档页数:2
构造函数explicit在C++中,可以使用关键字`explicit`来修饰一个类的构造函数,以防止隐式类型转换。
`explicit`构造函数要求用户必须使用显式转换来调用构造函数。
本文将详细介绍`explicit`构造函数的作用、用法、注意事项以及示例。
## 1. `explicit`构造函数的作用`explicit`关键字可以用于修饰类的单参数构造函数,这样做的目的是为了避免隐式类型转换。
当构造函数被声明为`explicit`时,只能通过显式转换来调用该构造函数,不允许进行隐式的类型转换。
隐式类型转换可能导致一些未预料的行为,降低代码的可读性和可维护性。
因此,在一些情况下,使用`explicit`关键字来限制隐式类型转换是一种良好的编程实践。
## 2. `explicit`构造函数的用法使用`explicit`修饰构造函数的语法如下所示:```cppexplicit 类名(参数列表) { ... }```需要注意的是,`explicit`只能修饰单参数的构造函数,不能用于默认构造函数或多参数构造函数。
当类的构造函数被声明为`explicit`时,在实例化该类对象时,必须使用显式转换来调用构造函数,否则编译器将会报错。
## 3. `explicit`构造函数的注意事项以下是使用`explicit`构造函数时需要注意的几点事项:###3.1避免隐式类型转换使用`explicit`构造函数可以避免隐式类型转换,明确地告诉编译器不进行隐式转换。
这样做可以提高代码的可读性和可维护性。
###3.2无法进行隐式类型转换一旦构造函数被声明为`explicit`,将无法进行隐式类型转换。
编译器会拒绝隐式的转换操作。
###3.3需要显式转换在实例化对象时,由于构造函数被声明为`explicit`,所以必须使用显式转换来调用构造函数。
这样可以增加代码的清晰度,并避免一些潜在的问题。
###3.4适用范围`explicit`构造函数通常在类型之间存在其中一种逻辑上的不兼容性时使用,通过限制隐式转换来加强类型检查。
32个关键字在c语言中的含义和作用【32个关键字在c语言中的含义和作用解析】在C语言中,有一些关键字是非常重要的,它们在程序中扮演着至关重要的角色。
下面,我将对这32个关键字进行深入解析,让我们来一探究竟。
1. #include在C语言中,#include用于包含头文件,使得在当前文件中可以使用所包含文件中的定义。
2. intint是C语言中的一个基本数据类型,代表整数。
3. charchar也是C语言中的一个基本数据类型,代表字符。
4. floatfloat是C语言中的一个基本数据类型,代表单精度浮点数。
5. doubledouble是C语言中的一个基本数据类型,代表双精度浮点数。
6. ifif是C语言中的条件语句,用于进行条件判断。
7. elseelse也是C语言中的条件语句,用于在条件不成立时执行的语句块。
8. switchswitch语句用于多条件判断,可以替代多个if-else语句。
9. case在switch语句中,case用于列举不同的条件分支。
10. default在switch语句中,default用于表示默认的条件分支。
11. forfor循环用于重复执行一个语句块。
12. whilewhile循环也用于重复执行一个语句块,但条件判断在循环之前进行。
13. dodo-while循环会先执行一次循环体,然后再进行条件判断。
14. breakbreak语句用于跳出循环。
15. continuecontinue语句用于结束当前循环,并开始下一次循环。
16. returnreturn语句用于结束函数的执行,并返回一个值。
17. voidvoid用于声明函数的返回类型,表示该函数没有返回值。
18. sizeofsizeof用于获取变量或类型的长度。
19. typedeftypedef用于给数据类型取一个新的名字。
20. structstruct用于定义结构体类型。
21. unionunion也用于定义数据类型,但它和结构体不同,它的所有成员共用一块内存。
c语言的32个关键字及其含义C语言是一门广泛应用于计算机编程的高级编程语言,其简洁、高效的特点使之成为许多程序员的首选。
而C语言的关键字则是构成C语言语法结构的基石,掌握这些关键字的含义对于编写高质量的C代码至关重要。
本文将会介绍C语言的32个关键字及其含义。
一、自动变量(auto)auto关键字用于声明自动变量,自动变量是在代码块中定义的变量。
它们的生命周期仅限于所在代码块,函数的参数也属于自动变量。
二、断言(assert)assert关键字用于在程序运行时进行断言验证,如果断言条件为假,程序将会中止执行。
断言通常用于调试和排错。
三、带宽限定(band)band关键字用于限定带宽,常用于定义延迟函数、外部中断和总线访问等场景。
四、布尔类型(bool)bool关键字用于声明布尔类型的变量,布尔类型只有两个值:真和假。
一般用于判断语句和循环语句的条件。
五、跳过(break)break关键字用于跳出循环或者switch语句块,提前终止程序的执行。
六、函数调用(call)call关键字用于向函数传递参数并调用函数。
它与return关键字相对应,后者用于从函数返回结果。
七、case标签(case)case关键字用于定义switch语句中不同分支的标签,根据不同的条件执行相应的代码。
八、常量(const)const关键字用于声明常量,常量值在程序执行期间不可更改。
通常用于定义不变的特定值,提高代码的可读性和可维护性。
九、continue(continue)continue关键字用于结束当前循环的当前迭代,并进入下一轮循环的迭代。
通常用于跳过某些不满足条件的循环迭代。
十、默认(default)default关键字用于定义switch语句中默认分支的代码块。
如果没有匹配的case 标签,将会执行默认分支的代码。
十一、定义(define)define关键字用于定义宏。
宏是一种在程序编译之前被展开的符号常量或者代码片段。
c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?如果c++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面所示:class MyClass{public:MyClass( int num );}....MyClass obj = 10; //ok,convert int to MyClass在上面的代码中编译器自动将整型转换为MyClass类对象,实际上等同于下面的操作:MyClass temp(10);MyClass obj = temp;上面的所有的操作即是所谓的"隐式转换".如果要避免这种自动转换的功能,我们该怎么做呢?嘿嘿这就是关键字explicit的作用了,将类的构造函数声明为"显示",也就是在声明构造函数的时候前面添加上explicit即可,这样就可以防止这种自动的转换操作,如果我们修改上面的MyClass类的构造函数为显示的,那么下面的代码就不能够编译通过了,如下所示:class MyClass{public:explicit MyClass( int num );}....MyClass obj = 10; //err,can‘t non-explict convertclass isbn_mismatch:public std::logic_error{public:explicit isbn_missmatch(const std::string &s):std:logic_error(s){}isbn_mismatch(const std::string &s,const std::string &lhs,const std::string &rhs):std::logic_error(s),left(lhs),right(rhs){}const std::string left,right;virtual ~isbn_mismatch() throw(){}};Sales_item& operator+(const Sales_item &lhs,const Sales_item rhs){if(!lhs.same_isbn(rhs)) throw isbn_mismatch("isbn missmatch",lhs.book(),rhs.book());Sales_item ret(lhs);ret+rhs;return ret;}Sales_item item1,item2,sum;while(cinitem1item2){try{ sun=item1+item2;}catch(constisbn_mismatch &e){ cerre.what()"left isbn is:"e.left"right isbn is:"e.rightendl;}}用于用户自定义类型的构造函数,指定它是默认的构造函数,不可用于转换构造函数。
构造函数explicit在C++中,构造函数是一种特殊的成员函数,用于初始化类的对象。
通常情况下,我们可以使用默认构造函数来创建对象,但有时我们可能需要限制隐式构造函数的使用,以避免不必要的对象创建。
这就是explicit构造函数的作用。
explicit构造函数是一种修饰符,用于限制隐式类型转换的发生。
它只能用于带有一个参数的构造函数,用于明确告诉编译器不要进行隐式类型转换。
为了更好地理解explicit构造函数的用途和工作原理,下面我将探讨其概念、用法和适用场景。
概念:explicit构造函数是在构造函数声明前加上explicit关键字的构造函数。
这样的构造函数只能用于显式创建对象,不能用于隐式类型转换。
当我们将一个值传递给通过explicit修饰的构造函数时,编译器不会进行自动类型转换。
用法:下面是一个使用explicit构造函数的例子:```class MyClasspublic:explicit MyClass(int value) : m_value(value) {}int m_value;};```在这个例子中,我们定义了一个类MyClass,它有一个带有int参数的构造函数。
通过在构造函数前加上explicit关键字,我们明确告诉编译器不要进行隐式类型转换。
这意味着我们只能使用显式的方式来创建MyClass的对象,例如:```MyClass obj = MyClass(10); // 显式创建对象MyClass obj2 = 10; // 隐式创建对象,编译错误```适用场景:使用explicit构造函数有以下几个典型的应用场景:1. 避免不必要的隐式类型转换:有时候,我们可能不希望一些类型的对象能够被隐式地转换成其他类型的对象。
通过使用explicit构造函数,我们可以明确告诉编译器不进行隐式类型转换,从而增加代码的可读性和安全性。
```class Stringexplicit String(int size) : m_size(size) {}private:int m_size;};void printString(const String& str)std::cout << str << std::endl;int maiprintString(10); // 隐式类型转换,编译错误printString(String(10)); // 显式创建对象return 0;```2. 避免二义性问题:有时候,如果一个类有多个构造函数,且参数类型相似,编译器可能无法确定应该调用哪个构造函数。
C++中explicit的用法1. 介绍在C++编程中,explicit是一个关键字,用于修饰构造函数。
它的作用是禁止编译器执行自动类型转换,以避免意外的类型转换造成的不确定性和错误。
在本文中,将对explicit的用法进行详细介绍,并举例说明其在实际编程中的应用。
2. explicit的基本概念在C++中,当一个构造函数只接受一个参数时,它实际上定义了一个从该参数类型到类类型的隐式类型转换。
这种隐式类型转换可能会导致一些潜在的问题,比如不期望的类型转换或者不明确的代码逻辑。
为了解决这些问题,C++11引入了explicit关键字,用于显式声明构造函数为显式构造函数,从而禁止编译器执行隐式类型转换。
3. explicit的使用方法在类的构造函数声明前加上explicit关键字,即可将该构造函数声明为显式构造函数。
例如:```cppclass Test {public:explicit Test(int value) : m_value(value) {}private:int m_value;};```在上面的例子中,Test类的构造函数接受一个int类型的参数,但加上了explicit关键字,表示该构造函数为显式构造函数,禁止编译器执行隐式类型转换。
4. 显式构造函数的优势通过使用explicit关键字声明构造函数,我们可以有效地避免一些潜在的问题,例如:- 避免意外的类型转换:对于只接受一个参数的构造函数,如果不使用explicit关键字,那么它将成为隐式类型转换的候选函数,这可能导致意外的类型转换,从而产生错误的结果。
- 明确代码逻辑:显式构造函数可以使代码的逻辑更加明确,使得代码阅读和维护更加容易。
5. 显式构造函数的应用场景显式构造函数通常适用于以下情况:- 构造函数只接受一个参数,并且该参数不能被隐式转换为类的类型。
- 需要避免意外的类型转换和提高代码的可读性。
6. 总结在C++编程中,显式构造函数是一个非常有用的特性,它可以有效地避免一些潜在的问题,提高代码的可靠性和可维护性。
c语言的37个关键字C语言是一种广泛应用于计算机编程的高级编程语言,它具有简单、高效、可移植等特点,被广泛应用于操作系统、嵌入式系统、游戏开发等领域。
C语言中有37个关键字,这些关键字在程序中具有特殊的含义,下面我们来逐一介绍这些关键字。
1. auto:用于声明自动变量,即在函数内部定义的变量。
2. break:用于跳出循环语句或switch语句。
3. case:用于switch语句中的分支。
4. char:用于声明字符类型变量。
5. const:用于声明常量,常量的值不能被修改。
6. continue:用于跳过循环中的某次迭代。
7. default:用于switch语句中的默认分支。
8. do:用于循环语句中的循环体。
9. double:用于声明双精度浮点数类型变量。
10. else:用于if语句中的分支。
11. enum:用于声明枚举类型。
12. extern:用于声明外部变量或函数。
13. float:用于声明单精度浮点数类型变量。
14. for:用于循环语句中的循环体。
15. goto:用于无条件跳转到指定标签。
16. if:用于条件语句中的判断。
17. int:用于声明整型变量。
18. long:用于声明长整型变量。
19. register:用于声明寄存器变量,即将变量存储在CPU的寄存器中,以提高程序的执行效率。
20. return:用于函数中返回值。
21. short:用于声明短整型变量。
22. signed:用于声明有符号类型变量。
23. sizeof:用于获取变量或数据类型的大小。
24. static:用于声明静态变量或函数。
25. struct:用于声明结构体类型。
26. switch:用于多分支选择语句。
27. typedef:用于定义新的数据类型。
28. union:用于声明共用体类型。
29. unsigned:用于声明无符号类型变量。
30. void:用于声明无返回值的函数或指针类型变量。
c语言的37个关键字及其含义C语言是一种广泛使用的编程语言,拥有许多关键字,这些关键字在程序中具有特殊的用途和含义。
下面是C语言的37个关键字及其含义:1. auto:用于声明自动存储类别的局部变量。
2. break:在循环或switch语句中,用于跳出当前循环或switch分支。
3. case:在switch语句中,用于标识不同的选择分支。
4. char:用于声明字符类型的变量或函数。
5. const:用于声明常量,其值不能被修改。
6. continue:用于跳过当前循环迭代,转到下一次迭代。
7. default:在switch语句中,用于定义默认情况的代码块。
8. do:用于创建一个执行语句块直到满足特定条件的循环。
9. double:用于声明双精度浮点数类型的变量或函数。
10. else:在if语句中,用于定义条件不为真时执行的代码块。
11. enum:用于声明枚举类型和枚举常量。
12. extern:用于声明变量或函数是在其他文件或模块中定义的。
13. float:用于声明单精度浮点数类型的变量或函数。
14. for:用于创建一个循环,指定初始条件、循环条件和循环迭代。
15. goto:用于无条件地转移到程序中的标记语句。
16. if:用于执行条件语句块,如果条件为真,则执行代码块。
17. int:用于声明整数类型的变量或函数。
18. long:用于声明长整数类型的变量或函数。
19. register:用于声明寄存器存储类别的局部变量。
20. return:用于从函数中返回值。
21. short:用于声明短整数类型的变量或函数。
22. signed:用于声明有符号数类型的变量或函数。
23. sizeof:用于获取数据类型或变量的大小。
24. static:用于声明静态存储类别的局部变量。
25. struct:用于声明结构体类型和结构体变量。
26. switch:用于多个选择分支的条件语句。
C语言中各关键词的含义和用途以下是C语言中常见的关键字以及它们的含义和用途:1. auto: 用于声明局部变量,表示变量的生命周期和作用域由编译器自动管理。
2. break: 用于循环或switch语句中,提前结束当前循环或switch 块。
3. case: 在switch语句中,用于匹配一些特定值并执行相应的语句。
4. char: 用于声明字符类型的变量。
5. const: 用于声明常量,表示该变量的值在程序运行期间不可修改。
6. continue: 用于循环语句中,结束当前循环的迭代,并开始下一次迭代。
7. default: 在switch语句中,用于处理没有匹配到任何case的情况。
8. do: 用于创建do-while循环,至少执行一次循环体。
9. double: 用于声明双精度浮点数类型的变量。
10. else: 在if语句中,用于处理条件为假时的分支。
11. enum: 用于创建枚举类型,定义一组具名的整型常量。
12. extern: 声明一个已在其他地方定义的变量或函数。
13. float: 用于声明单精度浮点数类型的变量。
14. for: 用于创建for循环,多用于迭代。
16. if: 用于创建if条件语句,根据条件的真假执行相应的语句。
17. int: 用于声明整数类型的变量。
18. long: 用于声明长整数类型的变量。
19. register: 声明存储在寄存器中的局部变量,提高访问速度。
20. return: 用于结束函数并返回一个值。
21. short: 用于声明短整数类型的变量。
22. signed: 用于声明有符号类型的变量。
23. sizeof: 返回一个数据类型或变量的字节大小。
24. static: 对局部变量和全局变量的存储类进行限定,使其在程序整个运行期间都存在。
25. struct: 用于声明结构体,可以包含多个不同类型的变量。
26. switch: 用于创建switch语句,在多个选择之间进行条件判断。
C# 参考之转换关键字:operator、explicit与implicitoperatoroperator关键字用于在类或结构声明中声明运算符。
运算符声明可以采用下列四种形式之一:1.public static result-type operator unary-operator ( op-typeoperand )2.public static result-type operator binary-operator (3. op-type operand,4. op-type2 operand25. )6.public static implicit operator conv-type-out ( conv-type-inoperand )7.public static explicit operator conv-type-out ( conv-type-inoperand )参数:1.result-type 运算符的结果类型。
2.unary-operator 下列运算符之一:+ - ! ~ ++ — true false3.op-type 第一个(或唯一一个)参数的类型。
4.operand 第一个(或唯一一个)参数的名称。
5.binary-operator 其中一个:+ - * / % & | ^ << >> == != > < >= <=6.op-type2 第二个参数的类型。
7.operand2 第二个参数的名称。
8.conv-type-out 类型转换运算符的目标类型。
9.conv-type-in 类型转换运算符的输入类型。
注意:1.前两种形式声明了用户定义的重载内置运算符的运算符。
并非所有内置运算符都可以被重载(请参见可重载的运算符)。
op-type 和op-type2 中至少有一个必须是封闭类型(即运算符所属的类型,或理解为自定义的类型)。
explicit关键字的用法(原创实用版)目录1.引言2.Explicit 关键字的含义3.Explicit 关键字的使用场景4.Explicit 关键字的作用5.示例6.结论正文【引言】在编程语言中,关键字(keyword)是指被编程语言保留用于特定目的的单词。
在这些关键字中,有一种被称为 explicit 关键字。
本文将详细介绍 explicit 关键字的含义、使用场景、作用以及示例。
【Explicit 关键字的含义】Explicit 关键字通常用于表示显式(explicit)的意思。
在编程语言中,它用于强调某个操作或变量需要显式声明或定义,而不是隐式(implicit)地默认或推断。
【Explicit 关键字的使用场景】Explicit 关键字的使用场景包括但不限于以下几种情况:1.声明变量:在声明变量时,使用 explicit 关键字可以强调变量需要显式声明,而不是隐式推断。
例如,在 C++中,可以使用`explicit`关键字声明一个显式转换的变量。
2.函数参数:在函数参数中使用 explicit 关键字,可以强调该参数需要显式传递,而不是隐式地从函数内部推断。
例如,在 C++中,可以使用`explicit`关键字声明一个显式参数的函数。
3.类型转换:在类型转换中使用 explicit 关键字,可以强调该转换需要显式进行,而不是隐式地进行自动类型转换。
例如,在 C++中,可以使用`explicit`关键字声明一个显式类型转换。
【Explicit 关键字的作用】Explicit 关键字的主要作用是提高代码的可读性和明确性。
通过使用 explicit 关键字,程序员可以清晰地表示某个操作或变量需要显式声明或定义,从而避免因隐式推断导致的错误或混淆。
【示例】以下是一个 C++示例,展示了如何使用 explicit 关键字声明一个显式转换的变量、一个显式参数的函数以及一个显式类型转换:```cpp#include <iostream>// 使用 explicit 关键字声明一个显式转换的变量explicit int explicitVar = 10;// 使用 explicit 关键字声明一个显式参数的函数explicit void explicitFunc(int explicitParam) {std::cout << "Explicit function called with explicit parameter: " << explicitParam << std::endl;}// 使用 explicit 关键字声明一个显式类型转换explicit int explicitConvert(double value) {return value * 2;}int main() {// 调用显式函数explicitFunc(5);// 使用显式转换int result = explicitConvert(3.5);std::cout << "Result of explicit conversion: " << result << std::endl;return 0;}```【结论】总之,explicit 关键字在编程语言中用于强调某个操作或变量需要显式声明或定义,而不是隐式地默认或推断。
c语言32个关键字详解auto:当定义函数参数和局部变量时,auto关键字的作用是根据变量类型的自动识别特性而获取变量的存储空间。
break:break关键字是用来终止当前循环或者终止switch/case 语句的执行,它后面可以加一个匹配标记,用来提供执行跳转。
case:case关键字用于在switch语句中定义不同的情况,当switch语句中的表达式匹配到case后面的值时,就会执行这个case 子句里面的语句。
char:char关键字用于定义字符型变量,它存储一个字符,可以用于字符串的存储和读取。
const:const关键字是一个修饰符,它可以修改变量的属性,使其值不可以被修改。
continue:continue关键字用于终止当前循环中本次循环的剩余语句,然后继续进行下一次循环。
default:default关键字用于定义switch语句中匹配不上任何case时,将执行的代码。
do:do关键字用于开始一个do-while循环,do-while循环是先执行循环体,然后判断条件,如果条件满足则继续执行当前循环,如果条件不满足则跳出循环。
double:double关键字用于定义双精度浮点型变量,它可以存储浮点数,也可以存储虚数。
else:else关键字用于在if...else语句中定义else条件语句,当if语句的表达式结果为false时,就会执行else子句。
enum:enum关键字是用来定义枚举类型数据,它可以定义一组常量,可以用来表示特殊的数值或代表某些属性。
extern:extern关键字用于声明外部变量和函数,其实它是一个用于程序编译的修饰符,只声明不定义,定义在另一模块中。
float:float关键字用于定义单精度浮点型变量,它可以存储浮点数,也可以存储虚数。
for:for关键字用于开始一个for循环,for循环是先判断条件,如果条件满足,则执行循环体,如果条件不满足,则跳出循环。
goto:goto关键字用于把程序的执行控制权转移到指定的位置,它可以用于实现不同的跳转,但不能跨函数调用。
c语言关键字及其含义用法C语言的关键字及其含义和用法如下:1.数据类型关键字:•char:声明字符型变量或函数。
•int:声明整型变量或函数。
•short:声明短整型变量或函数。
•long:声明长整型变量或函数。
•float:声明浮点型变量或函数。
•double:声明双精度浮点型变量或函数。
•enum:声明枚举类型变量或函数(将变量的值一一列出)。
•signed:声明有符号类型变量或函数。
•unsigned:声明无符号类型变量或函数。
•void:声明函数无返回值或无参数,声明无类型指针。
•struct:声明结构体变量或函数。
•union:声明共用数据类型。
2.控制语句关键字:•break:跳出当前循环。
•continue:中断本次循环,并转向下一次循环。
•default:switch语句中的默认选择项。
•do:用于构成do-while循环语句。
•else:构成if-else选择程序结构。
•for:构成for循环语句。
•if:构成if-else选择结构。
•return:用于返回函数的返回值。
•switch:用于开关语句。
•case:开关语句分支。
•while:循环语句的循环条件。
•goto:无条件跳转。
3.存储类型关键字:•auto:声明自动变量(缺省时编译器一般默认为auto)。
•extern:声明变量是在其他文件正声明(也可以看做是引用变量)。
•register:声明积存器变量。
•static:声明静态变量。
1.其他关键字:•const:声明只读类型变量。
•volatile:说明变量在程序执行过程中可能被隐含的改变。
•typedef:用于给数据类型取别名。
•sizeof:计算对象所占内存空间大小。
这些关键字在C语言中具有特定的含义和用法,它们用于声明变量、函数、控制程序流程、定义数据类型等。
熟练掌握这些关键字是编写C语言程序的基础。
c语言常用关键字及其含义C语言常用关键字及其含义如下:1. auto:声明自动变量。
自动变量是在函数内部定义的变量,其生命周期与函数的执行周期相同。
2. break:跳出当前循环或switch语句。
3. case:在switch语句中,用于标识一个分支。
4. const:定义常量,声明的变量值不能被修改。
5. continue:跳过当前循环的剩余代码,进入下一次循环。
6. default:在switch语句中,表示没有与任何case匹配时执行的代码块。
7. do:循环语句的起始关键字,用于执行一个循环体,并在判断条件为真时重复执行。
8. double:声明双精度浮点型变量。
9. else:与if语句配合使用,表示在if条件不成立时执行的代码块。
10. enum:定义枚举类型。
枚举类型是一个由一组常量组成的数据类型。
11. extern:声明变量或函数的外部链接。
12. float:声明单精度浮点型变量。
13. for:循环语句的起始关键字,用于执行一个循环体,并在判断条件为真时重复执行。
14. if:条件语句的起始关键字,用于根据条件判断是否执行某个代码块。
15. int:声明整型变量。
16. long:声明长整型变量。
17. register:声明寄存器变量。
寄存器变量存储在寄存器中,访问速度更快。
18. return:从函数中返回值,并终止函数的执行。
19. short:声明短整型变量。
20. signed:声明有符号类型变量。
21. sizeof:返回数据类型或变量所占的字节数。
22. static:声明静态变量,其生命周期持续整个程序的执行过程。
23. struct:定义结构体类型。
结构体是由不同类型的数据组成的数据类型。
24. switch:多分支选择语句,根据不同的值执行不同的代码块。
25. typedef:为已有数据类型定义一个别名。
26. union:定义联合类型。
联合类型可以在同一内存位置存储不同类型的数据。
C语言中的关键字是一种特殊的标识符,也被称为保留字,它们具有特定的意义和功能,并且在程序中具有不可或缺的作用。
大致上,我们可以将C语言中的关键字分为以下四类:数据类型关键字、控制语句关键字、存储类型关键字和其他关键字。
比方说,数据类型关键字包括"int"、"char"、"float"、"double"等,这些关键字主要用于声明变量或函数的数据类型;控制语句关键字如"if"、"else"、"while"等,这些关键字则用于控制程序的执行流程。
此外,“auto”关键字通常用于声明自动变量,“void”关键字可以声明无返回值的函数或者无类型指针,而“struct”则用于声明结构体变量或函数。
还有一些关键字,比如“volatile”,它告诉编译器指定的变量可能会随时发生变化,每次使用这个变量的时候必须从变量的地址中重新读取,这样能够确保编译器生成的代码能够正确处理这种可能发生的变化。
再比如"return",它是一个控制语句关键字,其主要作用是结束一个函数并返回其后面表达式中的值。
例如在main函数中使用return 0;表示程序正常退出。
总的来说,熟悉并理解这些关键字的作用和使用对于学习和掌握C语言是非常重要的。
C++ 中explicit 关键字的作用在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。
explicit使用注意事项:explicit 关键字只能用于类内部的构造函数声明上,explicit 关键字作用于单个参数的构造函数。
在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换。
在C++中,如果一个类有只有一个参数的构造函数,C++允许一种特殊的声明类变量的方式。
在这种情况下,可以直接将一个对应于构造函数参数类型的数据直接赋值给类变量,编译器在编译时会自动进行类型转换,将对应于构造函数参数类型的数据转换为类的对象。
如果在构造函数前加上explicit修饰词,则会禁止这种自动转换,在这种情况下,即使将对应于构造函数参数类型的数据直接赋值给类变量,编译器也会报错。
下面以具体实例来说明。
建立people.cpp 文件,然后输入下列内容:class People{public:int age;People (int a){age=a;}};void foo ( void ){People p1(10);//方式一People* p_p2=new People(10); //方式二People p3=10; //方式三}这段C++程序定义了一个类people,包含一个构造函数,这个构造函数只包含一个整形参数a,可用于在构造类时初始化age变量。
然后定义了一个函数foo,在这个函数中我们用三种方式分别创建了三个10岁的“人”。
第一种是最一般的类变量声明方式。
第二种方式其实是声明了一个people类的指针变量,然后在堆中动态创建了一个people实例,并把这个实例的地址赋值给了p_p2.第三种方式就是我们所说的特殊方式,为什么说特殊呢?我们都知道,C/C++是一种强类型语言,不同的数据类型是不能随意转换的,如果要进行类型转换,必须进行显式强制类型转换,而这里,没有进行任何显式的转换,直接将一个整型数据赋值给了类变量p3.因此,可以说,这里进行了一次隐式类型转换,编译器自动将对应于构造函数参数类型的数据转换为了该类的对象,因此方式三经编译器自动转换后和方式一最终的实现方式是一样的。
C++中explicit关键字的作用
explicit用来防止由构造函数定义的隐式转换。
要明白它的作用,首先要了解隐式转换:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。
例如:
class things
{
public:
things(const std::string&name = ""):
m_name(name),height(0),weight(10){}
int CompareTo(const things & other);
std::string m_name;
int height;
int weight;
};
复制代码
这里things的构造函数可以只用一个实参完成初始化。
所以可以进行一个隐式转换,像下面这样:
things a;
................//在这里被初始化并使用。
std::string nm = "book_1";
//由于可以隐式转换,所以可以下面这样使用
int result = pareTo(nm);
复制代码
这段程序使用一个string类型对象作为实参传给things的CompareTo函数。
这个函数本来是需要一个tings对象作为实参。
现在编译器使用string nm来构造并初始化一个things对象,新生成的临时的things对象被传递给CompareTo函数,并在离开这段函数后被析构。
这种行为的正确与否取决于业务需要。
假如你只是想测试一下a的重量与10的大小之比,这么做也许是方便的。
但是假如在CompareTo函数中还涉及到了要除以初始化为0的height 属性,那么这么做可能就是错误的。
需要在构造tings之后更改height属性不为0。
所以要限制这种隐式类型转换。
那么这时候就可以通过将构造函数声明为explicit,来防止隐式类型转换。
explicit关键字只能用于类内部的构造函数声明上,而不能用在类外部的函数定义上。
现在things类像这样:
class things
{
public:
explicit things(const std::string&name = ""):
m_name(name),height(0),weight(0){}
int CompareTo(const things & other);
std::string m_name;
int height;
int weight;
};
复制代码
这时再进行编译,在vs2008上会提示:没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符。
这时你仍然可以通过显示使用构造函数完成上面的类型转换:
things a;
................//在这里被初始化并使用。
std::string nm = "book_1";
//显示使用构造函数
int result = pareTo(things(nm));
复制代码
google的c++规范中提到explicit的优点是可以避免不合时宜的类型变换,缺点无。
所以google约定所有单参数的构造函数都必须是显示的,只有极少数情况下拷贝构造函数可以不声明称explicit。
例如作为其他类的透明包装器的类。
effective c++中说:被声明为explicit的构造函数通常比其non-explicit兄弟更受欢迎。
因为它们禁止编译器执行非预期(往往也不被期望)的类型转换。
除非我有一个好理由允许构造函数被用于隐式类型转换,否则我会把它声明为explicit。
我鼓励你遵循相同的政策。