explicit关键字的含义和用法
- 格式:pdf
- 大小:219.74 KB
- 文档页数:11
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在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`构造函数通常在类型之间存在其中一种逻辑上的不兼容性时使用,通过限制隐式转换来加强类型检查。
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语言是一门广泛应用于计算机编程的高级编程语言,其简洁、高效的特点使之成为许多程序员的首选。
而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;}}用于用户自定义类型的构造函数,指定它是默认的构造函数,不可用于转换构造函数。
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个关键字及其含义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的用法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
关键字 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的用法也不尽相同。
以下是一些常见的用法:
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 -。
转换构造函数转换构造函数是一种特殊的构造函数,它可以将一个对象从一种类型转换为另一种类型。
在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++构造函数与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关键字的用法(原创实用版)目录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在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这个关键字。