关于C++的 explicit关键字

合集下载

构造函数explicit

构造函数explicit

构造函数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`构造函数通常在类型之间存在其中一种逻辑上的不兼容性时使用,通过限制隐式转换来加强类型检查。

c++中 explicit关键字的含义和用法

c++中 explicit关键字的含义和用法

上面的所有的操作即是所谓的"隐式转换".
如果要避免这种自动转换的功能,我们该怎么做呢?嘿嘿这就是关键字explicit的作用了,将类的构造函数声明为"显示",也就是在声明构造函数的时候 前面添加上explicit即可,这样就可以防止这种自动的转换操作,如果我们修改上面的MyClass类的构造函数为显示的,那么下面的代码就不能够编 译通过了,如下所示:
{
public:
MyClass( int num );
}
....
MyClass obj = 10; //ok,convert int to MyClass
在上面的代码中编译器自动将整型转换为MyClass类对象,实际上等同于下面的操作:
MyClass temp(10);
MyClass obj = temp;
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;}
The implicit type conversion of const char * to a string object enables its users to write the following:string s;s = "Hello";The compiler implicitly transforms this intostring s;//pseudo C++ code:s = string ("Hello"); //create a temporary and assign it to sOn the other hand, if you declare this constructor explicit, you have to use explicit type conversion:class string{//...public:explicit string(const char *);};int main(){string s;s = string("Hello"); //explicit conversion now requiredreturn 0;}Extensive amounts of legacy C++ code rely on the implicit conversion of constructors. The C++ Standardizationcommittee was aware of that. In order to not make existing code break, the implicit conversion was retained. However, anew keyword, explicit, was introduced to the languageto enable the programmer to block the implicit conversionwhen it is undesirable. As a rule, a constructor that can be invoked with a single argument needs to be declaredexplicit. When the implicit type conversion is intentional and well behaved, the constructor can be used as animplicit conversion operator.

32个关键字在c语言中的含义和作用

32个关键字在c语言中的含义和作用

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语言的32个关键字及其含义

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  中 explicit关键字的含义和用法

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;}}用于用户自定义类型的构造函数,指定它是默认的构造函数,不可用于转换构造函数。

C++关键字及说明解释

C++关键字及说明解释

C++关键词asmautobad_castbad_typeidboolbreakcasecatchcharclassconstconst_castcontinuedefaultdeletedodoubledynamic_cast elseenumexcept explicit externfalsefinallyfloatforfriendgotoifinlineintlongmutable namespaceoperator private protected publicregister reinterpret_cast returnshortsignedsizeofstaticstatic_caststructswitch templatethistruetrytype_infotypedeftypeid typename unionunsignedusingvirtualvoidvolatilewchar_t whileasm已经被__asm替代了,用于汇编语言嵌入在C/C++程序里编程,从而在某些方面优化代码.虽然用asm关键词编译时编译器不会报错,但是asm模块的代码是没有意义的.(2)auto这个这个关键词用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。

这个关键词不怎么多写,因为所有的变量默认就是auto的。

(3)bad_cast,const_cast,dynamic_cast,reinterpret_cast,static_cast关于异常处理的,还不是太了解..(4)bad_typeid也是用于异常处理的,当typeid操作符的操作数typeid为Null指针时抛出.(5)bool不用多说了吧,声明布尔类型的变量或函数.(6)break跳出当前循环.The break statement terminates the execution of the nearest enclosing loop or conditional statement in which it appears.(7)caseswitch语句分支.Labels that appear after the case keyword cannot also appear outside a switch statement.(8)catch,throw,try都是异常处理的语句,The try, throw, and catch statements implement exception handling.(9)char声明字符型变量或函数.(10)class声明或定义类或者类的对象.The class keyword declares a class type or defines an object of a class type.(11)const被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

C语言32以及C++63个关键字及其含义

C语言32以及C++63个关键字及其含义

C语言32个关键字及其含义auto:自动变量用关键字auto作存储类别的声明。

(可以省略,不写则隐含确定为“自动存储类别”)break:不能用于循环语句和switch语句之外的任何其他语句中。

作用为结束循环。

case :情况之一char:字符型const:常量continue:作用结束本次循环,不是终止整个循环。

default:默认结束do :做(先做后判断)double:双精度else:别的enum:枚举类型,extern:外部变量声明float:浮点型for:循环语句,goto:标记。

作用是从内层循环跳到外层循环。

if:如果,条件语句int:整型long:长整型register:寄存器标识符return:返回值short:短整型signed:有符号型sizeof:大小,长度static:静态的struct:结构体switch:交换typedef:起别名union:共用体unsigned:无符号型void:无返回C++66个关键字的中文含义1.asm(汇编),用法如下:asm (指令字符串);允许在C++程序中嵌入汇编代码。

2. auto(自动,automatic)是存储类型标识符,表明变量“自动”具有本地范围,块范围的变量声明(如for循环体内的变量声明)默认为auto存储类型。

3. bool(布尔)类型,C++中的基本数据结构,其值可选为true(真)或者false(假)。

C++中的bool类型可以和int混用,具体来说就是0代表false,非0代表true。

bool类型常用于条件判断和函数返回值。

4. break(中断、跳出),用在switch语句或者循环语句中。

程序遇到break后,即跳过该程序段,继续后面的语句执行。

5. case用于switch语句中,用于判断不同的条件类型。

6. catch catch和try语句一起用于异常处理。

7. char char(字符,character)类型,C++中的基本数据结构,其值一般为0~255的int。

c语言32个关键字详解

c语言32个关键字详解

c语言32个关键字详解auto: auto关键字是c语言中用来声明局部变量的修饰符,它能够使程序员在一个函数的内部定义一个局部变量。

auto关键字的作用是使得这个局部变量在函数返回后不会消失,而是可以在函数的外部继续存在。

break: break关键字用于强制跳出循环,它可以用于while,do while或者for循环。

当它出现在循环内部时,循环立即终止,并且控制流程将会跳转到循环外部。

case: case关键字可以用来创建一个条件分支,并且它必须出现在switch语句中。

它可以使得程序不必以多重if语句来处理多重分支问题。

char: char关键字用来指定字符变量,它可以表示一个字符或者一个小整数,一般8位字节足以存放一个字符。

const: const关键字用来定义常量,它之后的变量不能被修改,一旦定义的常量将一直保存在程序的整个执行过程中。

continue: continue关键字用来结束当前迭代循环,并且进入下一次迭代循环。

当它出现在循环内部时,当前的循环将会立即终止,控制流程将会继续到循环的下一个迭代中。

default: default关键字用来指定switch中的默认case语句,当没有任何case匹配成功时,将会执行default后面的语句。

do: do关键字用来声明一个do-while循环,do-while循环通常用来保证在程序中某个条件至少被执行一次,它的基本形式为“do{}while()”,执行流程大致如下:首先执行do后面的语句,然后判断while后面的条件是否满足,如果满足,则继续执行do后面的语句,直到while条件不成立。

double: double关键字用来指定双精度浮点类型的变量,它能够表示一个比较大的数字,一般来说8个字节存储就足够了。

else: else关键字用来指定if语句的反条件分支,即当if检查的条件不满足时,会执行else后面的语句。

enum: enum关键字用来指定一组枚举类型的常量,它可以使枚举的常量有规律的递增或者递减,常用于建立某一种特定事物的有限集合。

c++中explicit的用法

c++中explicit的用法

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++编程中,显式构造函数是一个非常有用的特性,它可以有效地避免一些潜在的问题,提高代码的可靠性和可维护性。

Qt中的关键字----explicit

Qt中的关键字----explicit

Qt中的关键字----explicit
关键字 explicit 可以禁⽌“单参数构造函数”被⽤于⾃动类型转换,主要⽤于 "修饰 "构造函数. 指明构造函数只能显⽰使⽤,⽬的是为了防⽌不必要的隐式转化.
关键字 explicit 可以禁⽌“单参数构造函数”被⽤于⾃动类型转换。

光看这⼀句似乎不太容易明⽩,下⾯,举个简单地例⼦。

//main.cpp
#include <iostream>
using namespace std;
class Test
{
public:
Test(int a)
{
m_data = a;
}
void show()
{
cout << "m_data = " << m_data << endl;
}
private:
int m_data;
};
void main(void)
{
Test t = 2; // 将⼀个常量赋给了⼀个对象
t.show();
}
编译能够通过,执⾏结果:m_data = 2。

为什么会这样呢?原来C++通过隐式转换,构造了⼀个临时对象Test(2),将它赋给了t(这⾥调⽤了默认的构造函数,⽽不是重载的“=”,因为这是在对象创建的时候)。

那么,如果给构造函数加上关键字 explicit ,构造函数变成了 explicit Test(int a),再次编译,编译器就会报错。

这时,就只能显式地使⽤构造函数了Test t = Test(2) 。

c++0x

c++0x

维基百科c++0x1.介绍C++0x(读作see plus plus oh ex)是c++编程语言预计的新标准的一个非正式名称。

今后会替换现有的c++标准,(ISO/IEC 14882)的这个1998年发布并在2003年更新的版本。

老版本可以通俗的叫做c++98和c++03。

新版本会添加一些语言核心内容和扩展c++标准库,将纳入c++技术报告库(C++ Technical Report 1 (TR1) libraries)-很可能不包含特殊的数学函数。

目前为止这个标准还未完成,这篇文章可能不能反映出最近的c++0x情况。

N3092的这个国际草案标准在2010年的3月被发布了。

ISO/IEC JTC1/SC22/WG21 c++标准委员会的计划是完成投票表决最后的委员会草案在2010年的8月,和在2011年的3月的标准会议上完善最后的国际草案标准。

不管怎样,WG21 预计到ISO官方发布标准会经历6个月到1年的时间,到这个标准的发行出版得到2011年末。

为了完成日程,委员会决定集中精力解决截至到2006年的问题而忽略新产生的决议。

c++这样的编程语言使用进化的方式改善和发展。

在c++发展的过程中用这样的方式必定会引起兼容以前代码的问题。

不管怎样,根据Bjarne Stroustrup(C + +语言的创作者和委员会的成员)的公告,新标准将“几乎百分之百的兼容现有的标准C + +".2.变更内容简介内容1 c++的版本变动即将标准更新2 扩展C + +的语言核心3 运行时核心语言的性能增强3.1右值引用(Rvalue reference)和移动语义(move semantics)3.2广义常量表达式(Generalized constant expressions)3.3修改旧数据的简单(plain)定义4 核心语言生成时的性能增强4.1外部模板(Extern template)5 核心语言可用性增强5.1初始化列表(Initializer lists)5.2统一初始化(Uniform initialization)5.3类型推断(Type inference)5.4范围为基础的循环(Range-based for-loop)5.5 lambda函数和表达式(Lambda functions and expressions)5.6替代函数的语法(Alternative function syntax)5.7对象的构造改进(Object construction improvement)5.8虚函数的显式重写(Explicit virtual function overrides)5.9空指针常量(Null pointer constant)5.10强类型枚举(Strongly typed enumerations)5.11尖括号(Angle bracket)5.12显式转换运算符(Explicit conversion operators)5.13别名模板(Template aliases)5.14无限制联合(Unrestricted unions)6 核心语言功能的改善6.1可变参数模板(Variadic templates)6.2新的字符串(New string literals)6.3用户定义的文字(User-defined literals)6.4复合内存模型(Multitasking memory model)6.5线程本地存储(Thread-local storage)6.6只能显式使用,违约的和删除了的特殊的成员函数(Explicitly-defaulted and deleted special member functions)6.7定义long long int(Type long long int)6.8静态断言(Static assertions)6.9允许sizeof对一个类,这个类中的成员没有指定明确的对象(Allow sizeof to work on members of classes without an explicit object)6.10允许垃圾收集的实现(Allow garbage collected implementations)7 C + +标准库的变化7.1升级到标准库组件(Upgrades to standard library components)7.3 Tuple类型(一个大小固定的异构对象集合)(Tuple types)7.4哈希表(Hash tables)7.5正则表达式(Regular expressions)7.6通用的智能指针(General-purpose smart pointers)7.7可扩展的随机数设施(Extensible random number facility)7.8包装参考(Wrapper reference)7.9函数对象多形性包装(Polymorphous wrappers for function objects)7.10元编程的type特性(Type traits for metaprogramming)7.11运行时返回函数对象类型的统一方法(Uniform method for computing the return type of function objects)8 计划取消或不包含的功能(Features planned but removed or not included)抹除了?9 要被移除或者弃用的特征(Features to be removed or deprecated)10 参见(See also)11 参考资料11.1 C + +标准委员会的文件11.2 文章(Articles)12 外部链接。

C#关键字详解

C#关键字详解

1第一部分2访问关键字:base,this3base访问基类的成员。

用于从派生类中访问基类的成员,1.调用基类上已经被重写的方法。

2.指定创建派生类实例时应调用的基类构造函数。

**对基类的访问只能在派生类的构造函数实例的方法实例的属性访问器中。

属性访问器:get,set函数。

注意:!!!!!!!!!不能在静态方法中使用base关键字。

例:在子类的方法中写base.GetInfo();调用基类的方法。

基类中的构造函数重载了,Mybase()和Mybase(int i);在子类的构造函数中public MyDerived():base(int i)public MyDerived(int i):base()this:引用当前对象。

用于引用为其调用方法的当前实例。

静态成员函数没有this指针。

可以用于从构造函数,实例方法,实例访问器中访问成员。

this的一般用途:1.限定被相似的名子隐藏的成员public void A(int a, int b ){this.a=a;this.b=b;}2.将对象作为参数传递到函数中public void ShowInstance(){print(this);console.writeline("lalalalllalalala");}3.声明索引器public int this[int param]{get{ return array[param]; }set{ array[param]=value; }}注意!!!!!!静态方法,静态属性访问器或字段声明中不能用this。

二.转换关键字:explicit, implicit, operator1explicit:用于声明用户定义的显式类型转换运算符。

例:class MyType{public static explicit operator MyType(int i){//从int显式转换成MyType类型的代码!!!}}显式类型转换符必须通过类型转换调用。

11-C++经典面试100题

11-C++经典面试100题
17、有了 malloc/free 为什么还要 new/delete ?
【参考答案】malloc 与 free 是 C++/C 语言的标准库函数, new/delete 是 C++的运算符。它们都可用于申请动态内存和释 放内存。 对于非内部数据类型的对象而言,光用 malloc/free 无 法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象在消亡之前要自动执行析构函数。由于malloc/free 是库函 数而不是运算符,不在编译器控制权限之内,不能够把执行构造 函数和析构函数的任务强加于 malloc/free。 因此 C++语言需要 一个能完成动态内存分配和初始化工作的运算符 new,以及一个 能完成清理与释放内存工作的运算符 delete。注意 new/delete 不是库函数。
1、C和C++中struct有什么区别?
【参考答案】
Protection行为 C C++ 无
能否定义函数 否,但可以有函数指针
有,默认是private 可以
100条经典C++语言笔试题目
2、C++中的struct和class有什么区别?
【参考答案】从语法上讲,class和struct做类型定义时只有两点区 别: (一)默认继承权限。如果不明确指定,来自class的继承按照 private继承处理,来自struct的继承按照public继承处理; (二)成员的默认访问权限。class的成员默认是private权限, struct默认是public权限。 除了这两点,class和struct基本就是一个东西。语法上没有任何 其它区别。
100条经典C++语言笔试题目

c语言的37个关键字及其含义

c语言的37个关键字及其含义

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语言中的32个关键字及其意思

C语言中的32个关键字及其意思

由ANSI标准定义的C语言关键字共32个 :auto double int struct break else long switchcase enum register typedef char extern return unionconst float short unsigned continue for signed voiddefault goto sizeof volatile do if while static一、数据类型关键字(12个):1、char [tʃɑ:]:声明字符型变量或函数(1)主要内容字符:容纳单字符的一种基本数据类型;(2)n.炭;女清洁工 vt.烧焦;(3)字符类型:字符型(Char) c、字符串型(String) s 、二进制型(Binary) bn、布尔型(Boolean) b 、日期时间型(DateTime) d 、数组型(Array) a、象型(Object) o 、循环控制变量通常使用单一的字符;2、double [ˈdʌbəl] :声明双精度变量或函数(1)n. 两倍;(2)a. 两倍的,双重的;(3)v. 加倍的,快步走,加倍努力3、enum :声明枚举类型(1)枚举:枚举是一个被命名的整型常数的;(2)枚举类型;(3)列举型;(4)列举enumerate [iˈnju:məreit]4、float [fləut] :声明浮点型变量或函数(1)浮点数、(2)浮点型、(3)漂浮、(4)浮动5、int[int]:声明整型变量或函数(1)符号整数、(2)取整、(3)Int是 integer ['intidʒə] 的简写int 声明一个变量为整型。

占2个字节,最大表示范围:-32768到32767(十进制)。

long 声明一个变量为长整型。

长整型变量占4个字节,最大表示范围:-48(十进制)到47(十进制)。

6、long [lɔŋ] :声明长整型变量或函数(1)长整型(2)a./ ad.长(期)的(地)(3) n.长时间(4)vi.渴望7、short [ʃɔ:t] :声明短整型变量或函数(1)a. 短的,矮的、(2)n. 短裤、(3)adv. 短暂地;突然地,急地8、signed:声明有符号类型变量或函数(1)有符号的、(2)带正负号、(3)sign [sain] n.标记,符号;招牌;迹象 v.签(署)9、struct:声明结构体变量或函数(1)n.结构(2)结构体(4)创建构架数组(3)structural[ˈstrʌktʃərəl]a.结构的10、union [ˈju:niən]:声明共用体(联合)数据类型(1)联合、(2)n.工会,联盟、(3)合并、(4)团结11、unsigned [ʌn'saind]:声明无符号类型变量或函数(1)无符号的(1)无符号的12、void [vɔid] :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)(1)a.无效的、(2)没有的、(3)vt.使无效、(4)n.空虚感二、控制语句关键字(12个):A循环语句1、for [fə, fɔ:]:一种循环语句(可意会不可言传)2、do [du, du:] :循环语句的循环体3、while [wail] :循环语句的循环条件(1)conj.当…的时;(2)而;(3)虽然 n.一会儿 vt.消磨4、break [breik]:跳出当前循环(1)中断、(2)断开、(3)n.休息 vt.打破5、 continue[kənˈtinju:]:结束当前循环,开始下一轮循环(1)v.继续,延续,延伸B条件语句1、if [if]: 条件语句(1)条件函数、(2)conj.如果,假如、(3)是否、(4)即使、(5)无论何时2、else [els] :条件语句否定分支(与 if 连用)(1)a. 别的(2)ad. 其他,另外3、default [diˈfɔ:lt]:开关语句中的“其他”分支(1)预设、(2)n. 假设值,默认(值),不履行责任,缺席(3)v. 默认,不履行义务,缺席,拖欠(4) [计算机] 缺省D返回语句1、return [riˈtə:n]:子程序返回语句(可以带参数,也看不带参数)(1)v.返回、(2)恢复、(3)归还、(4)盈利三、存储类型关键字(4个)1、auto [ˈɔ:təu] :声明自动变量(一般不使用)(1)自动的、(2)汽车automobile [ˈɔ:təməubi:l]2、extern:声明变量是在其他文件正声明(也可以看做是引用变量)(1)外部(的)、(2)external [ikˈstə:nəl]a.外部的,外面的,外表的3、register [ˈredʒistə]:声明积存器变量(1)寄存器、(2)注册(表)(3)登记(表)4、static[ˈstætik] :声明静态变量(1)a. 静态的,静电的、(2)n. 静电,静电干扰四、其它关键字(4个):1、const :声明只读变量(1)常量、(2)常数、(3)编译时常量2、sizeof:计算数据类型长度(1)n. …的大小、(2)占的字节数(3)size [saiz]n.大小,尺寸 vt.按大小排列(或分类)3、typedef:用以给数据类型取别名(当然还有其他作用)(1)n. 类型定义、(2)数据类型说明(3)type [taip]n.类型,种类,品种;铅字 v.打(字)4、volatile [ˈvɔlətail]:说明变量在程序执行中可被隐含地改变(1)a.动荡不定的、(2)反复无常的、(3)易挥发的。

QtC++构造函数与explicit

QtC++构造函数与explicit

QtC++构造函数与explicit1、默认构造函数默认构造函数是指所有参数都提供了默认值的构造函数,通常指⽆参的构造函数或提供默认值的构造函数。

如类Test1和Test2的构造函数class Test1{public:Test1(){} // default constructor} ;或class Test2{public:Test2(int i=1){} // default constructor} ;如果你没有为你的类提供任何构造函数,那么编译器将⾃动为你⽣成⼀个默认的⽆参构造函数。

⼀旦你为你的类定义了构造函数,哪怕只是⼀个,那么编译器将不再⽣成默认的构造函数。

2、何时需要为你的类提供默认构造函数有很多情况,列举如下:1. 当你使⽤静态分配的数组,⽽数组元素类型是某个类的对象时,就要调⽤默认的构造函数,⽐如下⾯的代码。

Object buffer[10]; // call default constructor2. 当你使⽤动态分配的数组,⽽数组元素类型是某个类的对象时,就要调⽤默认的构造函数,⽐如下⾯的代码,如果Object没有默认的构造函数,是⽆法通过编译的,因为new操作符要调⽤Object类的⽆参构造函数类初始化每个数组元素。

Object* buffer = new Object[10];3. 当你使⽤标准库的容器时,如果容器内的元素类型是某个类的对象时,那么这个类就需要默认的构造函数,原因同上。

vector<Object> buffer;4. ⼀个类A以另外某个类B的对象为成员时,如果A提供了⽆参构造函数,⽽B未提供,那么A则⽆法使⽤⾃⼰的⽆参构造函数。

下⾯的代码将导致编译错误。

class B{B(int i){}};class A{A(){}B b;};int main(void){A a(); // error C2512: 'B' : no appropriate default constructor availablegetchar() ;return0 ;}再⽐如下⾯的代码,类A定义了拷贝构造函数,⽽没有提供默认的构造函数,B继承⾃A,所以B在初始化时要调⽤A的构造函数来初始化A,⽽A没有默认的构造函数,故产⽣编译错误。

explicit关键字的用法

explicit关键字的用法

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个关键字详解

c语言32个关键字详解

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++ 中explicit 关键字的作用

C++ 中explicit 关键字的作用

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.因此,可以说,这里进行了一次隐式类型转换,编译器自动将对应于构造函数参数类型的数据转换为了该类的对象,因此方式三经编译器自动转换后和方式一最终的实现方式是一样的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int ns = 0;
s = 1; // 1 oops, programmer intended to write ns = 1,
}
In the expression s= 1;, the programmer simply mistyped the name of the
int f(string s);
int main()
{
f(1); // without a an explicit constructor,
//this call is expanded into: f ( string(1) );
On the other hand, if you declare this constructor explicit, you have to
use explicit type conversion:
class string
{
//...
关于C++的 explicit关键字
Posted on 2006-02-05 05:16 Tommy Liang 阅读(6316) 评论(6) 编辑 收藏 引用 所属分类:
C++语言与规范
简而言之:explicit修饰的构造函数不能担任转换函数
implicit conversion was retained. However, a
new keyword, explicit, was introduced to the languageto enable the
programmer to block the implicit conversion
public:
explicit string(const char *);
};
int main()
{
string s;
s = string("Hello"); //explicit conversion now required
searches for a user-defined conversion that allows this expression;
indeed, it finds the constructor that takes int.
Consequently, the compiler interprets the expression s= 1; as if the
string(const char *); // constructor and implicit conversion operator
~string();
};
Class string has three constructors: a default constructor, a constructor
这个 《ANSI/ISO C++ Professional Programmer's Handbook 》是这样说的
explicit Constructors
A constructor that takes a single argument is, by default, an implicit
argument needs to be declared explicit:
class string
{
//...
public:
explicit string(int size); // block implicit conversion
can either be a cryptic coding style or simply a programmer's
typographical error. However, due to the implicit
conversion constructor of class string, it will pass unnoticed:
typographical error this time:
int main()
{
string s = "hello"; //OK, convert a C-string into a string object
int ns = 0;
s = 1; // compile time error ; this time the compiler catches the typo
}
Why aren't all constructors automatically declared explicit? Under some
variable ns, typing s instead. Normally,
the compiler detects the incompatible types and issues an error message.
However, before ruling it out, the compiler first
initial preallocated buffer at the specified size. However, in the case of
class string, the automatic conversion is
dubious. Converting an int into a string object doesn't make sense,
conditions, the automatic type conversion is
useful and well behaved. A good example of this is the third constructor
of string:
string(const char *);
//was that intentional or merely a programmer's typo?
}
'In order to avoid such implicit conversions, a constructor that takes one
behaved, the constructor can be used as an
implicit conversion operator.
class string
{
private:
int size;
int capacity;
char *buff;
public:
string();
string(int size); // constructor and implicit conversion operator
when it is undesirable. As a rule, a constructor that can be invoked with
a single argument needs to be declared
explicit. When the implicit type conversion is intentional and well
关于C++的 explicit关键字 - tommy - C++博客
tommy
It's hard to tell the world we live in is either a reality or a
dream
conversion operator, which converts its argument to
an object of its class (see also Chapter 3, "Operator Overloading").
Examine the following concrete example:
return 0;
}
Extensive amounts of legacy C++ code rely on the implicit conversion of
constructors. The C++ Standardization
committee was aware of that. In order to not make existing code break, the
programmer had written
s = string(1);
You might encounter a similar problem when calling a function that takes a
string argument. The following example
although this is exactly what this constructor does.
Consider the following:
int main()
{
string s = "hello"; //OK, convert a C-string into a string object
that takes int, and a constructor that
constructs a string from const char *. The second constructor is used to
create an empty string object with an
string(const char *); //implicit conversion
相关文档
最新文档