explicit关键字的含义和用法
explicit和implicit的含义
explicit 和 implicit 属于转换运算符,如用这两者可以让我们自定义的类型支持相互交换explicti 表示显式转换,如从 A -> B 必须进行强制类型转换(B=(B)A)implicit 表示隐式转换,如从 B -> A 只需直接赋值(A=B)隐式转换可以让我们的代码看上去更漂亮、更简洁易懂,所以最好多使用implicit 运算符。
不过!如果对象本身在转换时会损失一些信息(如精度),那么我们只能使用 explicit 运算符,以便在编译期就能警告客户调用端示例:using System;using System.Collections.Generic;using System.Text;namespace Example23{class Program{//本例灵感来源于大话西游经典台词“神仙?妖怪?”–主要是我实在想不出什么好例子了class Immortal{public string name;public Immortal(string Name){name=Name;}public static implicit operator Monster(Immortal value){return new Monster( + “:神仙变妖怪?偷偷下凡即可。
”);}}class Monster{public string name;public Monster(string Name){name=Name;}public static explicit operator Immortal(Monster value){return new Immortal( + “:妖怪想当神仙?再去修炼五百年!”);}}static void Main(string[] args){Immortal tmpImmortal=new Immortal(“紫霞仙子”);//隐式转换Monster tmpObj1=tmpImmortal;Console.WriteLine();Monster tmpMonster=new Monster(“孙悟空”); //显式转换Immortal tmpObj2=(Immortal)tmpMonster; Console.WriteLine(); Console.ReadLine();}}}结果:紫霞仙子:神仙变妖怪?偷偷下凡即可。
构造函数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关键字的含义和用法
上面的所有的操作即是所谓的"隐式转换".
如果要避免这种自动转换的功能,我们该怎么做呢?嘿嘿这就是关键字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.
explicit 用法
explicit 用法explicit关键字作用:禁止隐式调用类的单参数的构造函数。
上述实际上由两种情形:1. 禁止隐式调用拷贝构造函数2. 禁止类对象之间的隐式转换。
类对象间的隐式转换:利用一个已经存在的其他类型的对象来创建本类的新对象,且不显示调用本类的构造函数。
案例:#include <iostream>using namespace std;class A{public:A(){num = 9000;}A(int n){this->num = n;}A(const A&a){num = a.num;}friend void show(const A&);private:int num;};void show(const A& a){cout << "a.num = "<< a.num << endl;}int main(){// 隐式调用类A的单参的构造器cout << "Hello world!" << endl;A a1 = 5000;//调用隐式转换构造器A a2 = a1;//调用隐式拷贝构造器show(a1);show(a2);show(6000);return 0;}上述隐式调用C++语法是允许的,但很多人对这种表示方式不习惯,觉得程序的可读性较差。
为了禁止对类的单参数构造器的隐式调用,C++引入关键字explicit。
在类的定义中,在任何一个单参数构造器前加explicit,即可以禁止对该构造器的隐式调用。
案例:#include <iostream>using namespace std;class A{public:A(){num = 0;}explicit A(int n){this->num = n;}explicit A(const A& a){num = a.num;}friend void show(const A&);private:int num;};void show(const A& a){cout << " variable:" << a.num << endl;}int main(){//cout << "Hello world!" << endl;A a1(32);A a2(a1);show(a1);show(a2);show(A(6000));return 0;}这样程序既可以正常运行,并具有更好的可读性。
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++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面所示: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++关键词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个关键字及其含义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++中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
关键字 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) 。
explicit用法
explicit用法
Explicit是一个英文单词,它的意思是“明确的”、“清晰的”、“明文规定的”。
在不同的语境下,explicit的用法也不尽相同。
以下是一些常见的用法:
1. Explicit language:这是指带有粗俗、露骨、不雅等特点的语言。
例如,有些电影或歌曲会含有explicit language的警告。
2. Explicit content:这是指含有成人内容、暴力、色情等敏感内容的媒体作品,例如电影、电视剧、小说、音乐等。
一些网站或平台会标注内容为explicit,以便用户自行选择是否查看。
3. Explicit instruction:这是指明确的指示或规定。
例如,老师在讲解问题时给出的步骤、法律文件中的具体规定等都可以称作explicit instruction。
4. Explicit memory:这是指明确的记忆,即通过有意识的努力所产生的记忆。
例如,学习时专门记忆某个知识点,或者有意识地练习某项技能,都是属于explicit memory的范畴。
5. Explicit function:这是指可以明确表达、定义的函数。
在数学领域中,一些函数可以用明确的公式或算法来表示,这些函数就可以被称为explicit function。
总之,explicit这个词在不同的场合中有着不同的含义和用法,需要具体情境去理解。
- 1 -。
explicit,implicit,operator 重载运算符
注意:
转换运算符将源类型转换为目标类型。源类型提供转换运算符。与隐式转换不同,必须通过强制转换的方式来调用显式转换运算符。如果转换操作可能导致异常或丢失信息,则应将其标记为 explicit。这可以防止编译器无提示地调用可能产生无法预见后果的转换操作。
conv-typ种形式声明了用户定义的重载内置运算符的运算符。并非所有内置运算符都可以被重载(请参见可重载的运算符)。op-type 和 op-type2 中至少有一个必须是封闭类型(即运算符所属的类型,或理解为自定义的类型)。例如,这将防止重定义整数加法运算符。
后两种形式声明了转换运算符。conv-type-in 和 conv-type-out 中正好有一个必须是封闭类型(即,转换运算符只能从它的封闭类型转换为其他某个类型,或从其他某个类型转换为它的封闭类型)。
运算符只能采用值参数,不能采用 ref 或 out 参数。
C# 要求成对重载比较运算符。如果重载了==,则也必须重载!=,否则产生编译错误。同时,比较运算符必须返回bool类型的值,这是与其他算术运算符的根本区别。
public static explicit operator conv-type-out ( conv-type-in operand )
参数:
result-type 运算符的结果类型。
unary-operator 下列运算符之一:+ - ! ~ ++ — true false
op-type 第一个(或唯一一个)参数的类型。
explicit 关键字用于声明必须使用强制转换来调用的用户定义的类型转换运算符。
implicit 关键字用于声明隐式的用户定义类型转换运算符。如果转换过程可以确保不会造成数据丢失,则可使用该关键字在用户定义类型和其他类型之间进行隐式转换。
11-C++经典面试100题
【参考答案】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++中,转换构造函数是通过使用关键字“explicit”或“implicit”来定义的。
本文将介绍转换构造函数的概念、用法和注意事项。
概念转换构造函数是一种特殊的构造函数,它可以将一个对象从一种类型转换为另一种类型。
转换构造函数可以将一个对象从一种类型转换为另一种类型,也可以将一个对象从一个类转换为另一个类。
转换构造函数的语法如下:class 类名{public:explicit/implicit 类名(参数列表);};其中,explicit和implicit是关键字,用于指定转换构造函数的类型。
explicit表示显式转换,只能通过强制类型转换来调用;implicit表示隐式转换,可以自动调用。
用法转换构造函数可以用于以下情况:1.将一个对象从一种类型转换为另一种类型。
例如,将一个整数转换为一个字符串:class String{public:String(int num){stringstream ss;ss<<num;ss>>str;}private:string str;};2.将一个对象从一个类转换为另一个类。
例如,将一个基类指针转换为一个派生类指针:class Base{public:virtual void func(){}};class Derived:public Base{public:void func(){}};int main(){Base* b=new Derived;Derived* d=dynamic_cast<Derived*>(b);return 0;}注意事项使用转换构造函数时需要注意以下几点:1.转换构造函数必须是公有的。
2.转换构造函数不能有返回值。
3.转换构造函数不能有参数默认值。
4.转换构造函数不能被继承。
5.转换构造函数不能被重载。
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关键字的用法(原创实用版)目录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 关键字在编程语言中用于强调某个操作或变量需要显式声明或定义,而不是隐式地默认或推断。
explicit关键字
explicit关键字⼀: explicit在QT的开发中,是经常见到的关键字,现在来讲讲下这个关键字的作⽤。
⾸先,类的构造函数⼀般是隐式⾃动转换的,代码如下: class TestMy { public: TestMy() { cout<<"默认构造函数1"<<endl; } TestMy(const char *str) { cout<<"默认构造函数2"<<endl; } TestMy(int size) { mSize=size; cout<<"默认构造函数3"<<endl; } char *name; int mSize; }; void test01() { TestMy str4; //调⽤⽆参数的构造函数,因为TestMy提供了两个带参数的构造函数,这个不提供的话,这样写编译会报错 TestMy str1="abc"; //调⽤的是TestMy(const char *str) TestMy str2(20); //调⽤的是TestMy(int size) TestMy str3=40; //调⽤的是TestMy(int size) TestMy str5='A'; //调⽤的是TestMy(int size),且size等于'A'对应的ASCCI值 } int main() { test01(); return 0; } 运⾏的结果如下: 默认构造函数1 默认构造函数2 默认构造函数3 默认构造函数3 默认构造函数3 //================================================ 解析:上⾯的代码中, "TestMy str3=40" 这句为什么是可以的呢? 在C++中, 如果构造函数只有⼀个参数时, 那么在编译的时候就会有⼀个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象. 也就是说 "TestMy str3=40" 这段代码, 编译器⾃动将整型转换为TestMy 类对象, 实际上等同于下⾯的操作: TestMy str3(40); 或 TestMy temp(40); TestMy str3 = temp; 但是上⾯的代码容易给⼈易解,是会str3开辟个40个char类型⼤⼩的空间,还是说将赋值字符串为“40”,所以上⾯为了解决这种误解,就得加上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.因此,可以说,这里进行了一次隐式类型转换,编译器自动将对应于构造函数参数类型的数据转换为了该类的对象,因此方式三经编译器自动转换后和方式一最终的实现方式是一样的。
explicit的用法总结大全
explicit的用法总结大全(学习版)编制人:__________________审核人:__________________审批人:__________________编制学校:__________________编制时间:____年____月____日序言下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!并且,本店铺为大家提供各种类型的经典范文,如英语单词、英语语法、英语听力、英语知识点、语文知识点、文言文、数学公式、数学知识点、作文大全、其他资料等等,想了解不同范文格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor.I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!In addition, this shop provides various types of classic sample essays, such as English words, English grammar, English listening, English knowledge points, Chinese knowledge points, classical Chinese, mathematical formulas, mathematics knowledge points, composition books, other materials, etc. Learn about the different formats and writing styles of sample essays, so stay tuned!explicit的用法总结大全explicit的意思adj. 明确的,清楚的,直言的,详述的,不隐瞒的变形:副词:explicitly;explicit用法explicit可以用作形容词explicit表示相当明确清晰,没有丝毫模棱两可或模糊不清。
explicit
英语单词
01 单词用法
03 双语例句
目录
02 短语搭配 04用作为形容词,用作形容词译为“明确的;清楚的;直率的;详述的”。
单词用法
柯林斯英汉双解大词典 explicit/ɪkˈsplɪsɪt/CET4
短语搭配
explicit memory外显记忆 ;外显性记忆 ;制内存 explicit function[数]显函数 ;显功能 ;显函數 ;外显函数 explicit address[计]显式地址 ;显示地址 ;显式地址
词根词缀
词根 plex, plic, ply= to fold重叠,折叠
谢谢观看
双语例句
In addition, parents and teachers can help children by providing explicit instruction regarding the mind as a learning machine.
此外,家长和老师还可以提供明确的指导,帮助孩子把大脑视为一台学习机器。 He avoids the explicit answer to us. 他避免给我们明确的回答 The reasons for the decision should be made explicit. 应该直截了当给出决定的理由。 She was quite explicit about why she had left. 她对自己离开的原因直言不讳。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
这个 《ANSI/ISO C++ Professional Programmer's Handbook 》是这样说的 explicit Constructors A constructor that takes a single argument is, by default, an implicit conversion operator, which converts its argument to an object of its class (see also Chapter 3, "Operator Overloading"). Examine the following concrete example:
class string { private: int size; int capacity; char *buff; public: string(); string(int size); // constructor and implicit conversion operator string(const char *); // constructor and implicit conversion operator ~string(); }; Class string has three constructors: a default constructor, a constructor 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 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, 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 int ns = 0; s = 1; // 1 oops, programmer intended to write ns = 1, }
string(const char *); //implicit conversion ~string(); }; An explicit constructor does not behave as an implicit conversion operator, which enables the compiler to catch the 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 conditions, the automatic type conversion is useful and well behaved. A good example of this is the third constructor of string: string(const char *); 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 into string s; //pseudo C++ code: s = string ("Hello"); //create a temporary and assign it to s On the other hand, if you declare this constructor explicit, you have to use explicit type conversion:
Sales_item item1,item2,sum; while(cin>>item1>>item2) {
try{ sun=item1+item2; }catch(const isbn_mismatch &e) { cerr<<e.what()<<"left is:"<<e.right<<endl; } } 用于用户自定义类型的构造函数,指定它是默认的构造函数, 不可用于转换构造函 数.因为构造函数有三种:1 拷贝构造函数 2 转换构造函数 3 一般的构造函数(我自己 的术语^_^) 另:如果一个类或结构存在多个构造函数时,explicit 修饰的那个构造函数就是默认 的 class 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(){} }; isbn is:"<<e.left<<"right isbn
In the expression s= 1;, the programmer simply mistyped the name of the 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 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 programmer had written s = string(1); You might encounter a similar pro takes a string argument. The following example 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: int f(string s); int main() { f(1); // without a an explicit constructor, //this call is expanded into: f ( string(1) ); //was that intentional or merely a programmer's typo? } 'In order to avoid such implicit conversions, a constructor that takes one argument needs to be declared explicit: class string { //... public: explicit string(int size); // block implicit conversion
c++中 explicit 关键字的含义和用法 2009-02-27 14:56c++中的 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 );