关键字explicit的作用
C++构造函数、复制构造函数和析构函数专题(修订版)
示例:构造函数和Biblioteka 认构造函数#include <iostream> #include <string> using namespace std; class A{public: //void A(){} //A()const{} //A1(){} A(){cout<<"A"<<endl;} A(int i){cout<<"Ai"<<endl;} }; //构造函数一般被声明为公有的,因为主要是用来初始化对象的数据成员的 //错误,构造函数不能反回任何值(包括void类型) //错误,构造函数不能是const或volatile的 //错误,构造函数的名称必须与类名相同。 //正确,构造函数可以有形参也可以没有形参 //正确,可以重载多个构造函数的版本
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#常用关键字1)abstract 可以和类、方法、属性、索引器及事件一起使用,标识一个可以扩展但不能被实体化的、必须被实现的类或方法。
2)as 一个转换操作符,如果转换失败,就返回null。
3)base 用于访问被派生类或构造中的同名成员隐藏的基类成员。
4)catch 定义一个代码块,在特定类型异常抛出时,执行块内代码。
参见try和finally。
5)checked 既是操作符又是语句。
确保编译器运行时,检查整数类型操作或转换时出现的溢出。
6)const 标识一个可在编译时计算出来的变量值,即一经指派不可修改的值。
7)delegate 指定一个声明为一种委托类型。
委托把方法封装为可调用实体,能在委托实体中调用。
8)enum 表示一个已命名常量群集的值类型。
9)event 允许一个类或对象提供通知的成员,他必须是委托类型。
10)explicit 一个定义用户自定义转换操作符的操作符,通常用来将内建类型转换为用户定义类型或反向操作。
必须再转换时调用显示转换操作符。
11)extern 标识一个将在外部(通常不是c#语言)实现的方法。
12)finally 定义一个代码块,在程序控制离开try代码快后执行。
参见try和catch。
13)fixed 在一个代码块执行时,在固定内存位置为一个变量指派一个指针。
14)foreach 用于遍历一个群集的元素。
15)goto 一个跳转语句,将程序执行重定向到一个标签语句。
16)implicit 一个操作符,定义一个用户定义的转换操作符。
通常用来将预定义类型转换为用户定义类型或反向操作。
隐式转换操作符必须在转换时使用。
17)interface 将一个声明指定为接口类型,即实现类或构造必须遵循的合同。
18)internal 一个访问修饰符。
19)namespace 定义一个逻辑组的类型和命名空间。
20)operator 用来声明或多载一个操作符。
21)out 标识一个参数值会受影响的参数,但在传入方法时,该参数无需先初始化。
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,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 关键字用于声明隐式的用户定义类型转换运算符。如果转换过程可以确保不会造成数据丢失,则可使用该关键字在用户定义类型和其他类型之间进行隐式转换。
c+关键字大全
C++关键字大全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。
这256个字符对应着256个ASCII码。
char类型的数据需要用单引号’’括起来。
8. class class(类)是C++面向对象设计的基础。
使用class关键字声明一个类。
9. const const(常量的,constant)所修饰的对象或变量不能被改变,修饰函数时,该函数不能改变在该函数外面声明的变量也不能调用任何非const函数。
在函数的声明与定义时都要加上const,放在函数参数列表的最后一个括号后。
在C++中,用const声明一个变量,意味着该变量就是一个带类型的常量,可以代替#define,且比#define多一个类型信息,且它执行内链接,可放在头文件中声明;但在C中,其声明则必须放在源文件(即.C文件)中,在C中const声明一个变量,除了不能改变其值外,它仍是一具变量10. const_cast 用法:const_cast<type_id> (expression) 该运算符用来修改类型的const或volatile属性。
ABAQUS 关键字详解
ABAQUS 关键字详解2010-06-03 19:47:14 作者:huright*Boundary:指定边界条件(用来在节点定义边界条件或在子模型分析中指定被驱动的节点。
可选参数:amplitude:该参数仅在一些预设的变量有非零大小时使用。
设置该参数等于amplitude曲线名。
如果在standard中忽略该参数,则是线性ramp或是阶越型step。
位移只能是ramp型,而移动速度和转动速度只能是step型。
如果在explicit里忽略该参数,则参考的数量会在step开始时立刻应用,并保持常数。
在standard动态或模态分析中,应用与位移或速度的振幅曲线会被自动光滑处理。
而在explicit动态分析中,用户必须请求平滑处理才可以。
load case:该参数只用于standard分析,它只在直接法稳态动力学和屈曲分析中使用,在这两个过程中,该参数可以设置等于1(默认)或2。
如果用于直接法稳态动力学中,load case=1定义边界条件的实部,而load case=2定义了虚部。
如果用于屈曲分析,load case=1为应用载荷定义边界条件,而load case=2用来为屈曲模态定义反对称边界条件op:设置op=mod(默认)更改已存边界条件或为以前未被约束的自由度添加边界条件 op=new则如果所有当前起作用的边界条件都被移除,为了移除边界条件,使用op=new并重新指定素有要被处理的边界条件。
如果在standard的应力/位移分析中边界条件被移除,他们会被与在前一个step中计算产生的反力相等的集中力代替,如果该step是通用非线性分析步,则集中力会根据*step中的amplitude 参数来移除。
因此,默认幅值被使用,而集中力将在该静态分析step结束后被线性减少到零,然后立刻到动态分析。
type:用于应力/位移分析指定数值是位移历程形式、速度历程形式还是加速度历程形式。
在standard中,type=velocity是指定有限转动。
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.因此,可以说,这里进行了一次隐式类型转换,编译器自动将对应于构造函数参数类型的数据转换为了该类的对象,因此方式三经编译器自动转换后和方式一最终的实现方式是一样的。
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++编程中,显式构造函数是一个非常有用的特性,它可以有效地避免一些潜在的问题,提高代码的可靠性和可维护性。
构造函数explicit
构造函数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. 避免二义性问题:有时候,如果一个类有多个构造函数,且参数类型相似,编译器可能无法确定应该调用哪个构造函数。
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这个关键字。
构造函数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`构造函数通常在类型之间存在其中一种逻辑上的不兼容性时使用,通过限制隐式转换来加强类型检查。
explicit关键字的用法
explicit关键字的用法explicit关键字在C++中是用来修饰构造函数的。
当一个构造函数被explicit修饰时,意味着该构造函数只能被显式调用,而不能进行隐式的类型转换。
使用explicit关键字的主要目的是为了防止在不需要的地方进行隐式类型转换,从而提高代码的可读性和安全性。
下面是一个示例,说明explicit关键字的使用:```class MyInt {private:int value;public:explicit MyInt(int val) : value(val) {}int getValue() const {return value;}};void printValue(const MyInt& myInt) {std::cout << myInt.getValue() << std::endl;}int main() {MyInt myInt1 = 10; //错误,隐式类型转换被禁止MyInt myInt2(20); //正确,显式调用构造函数printValue(myInt2); //正确,隐式调用拷贝构造函数return 0;}```在上述示例中,MyInt类的构造函数被explicit关键字修饰,所以不能使用隐式类型转换进行对象的构造,而需要显式调用构造函数。
当我们通过显式调用构造函数创建了一个MyInt对象后,可以像普通对象一样使用它。
此外,使用explicit关键字可以避免特定的歧义,特别是在函数重载时。
假设有两个构造函数,一个是带有整型参数的构造函数,另一个是带有浮点型参数的构造函数。
如果没有使用explicit关键字修饰,那么在调用构造函数时可能会有类型歧义产生,而使用了explicit关键字后,编译器会强制用户使用明确的类型进行构造。
这样可以避免潜在的错误。
总结来说,使用explicit关键字可以防止不必要的隐式类型转换,提高代码的可读性和安全性。
C#关键字大全
C#关键字大全第一部分:C#关键字1)abstract 修饰符可以和类、方法、属性、索引器及事件一起使用。
在类声明中使用abstract 修饰符以指示某个类只能是其他类的基类。
标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现2)as 运算符用于在兼容的引用类型之间执行某些类型的转换。
3)base 关键字用于从派生类中访问基类的成员调用基类上已被其他方法重写的方法。
指定创建派生类实例时应调用的基类构造函数。
基类访问只能在构造函数、实例方法或实例属性访问器中进行。
从静态方法中使用 base 关键字是错误的。
4)bool 关键字是 System.Boolean 的别名。
它用于声明变量来存储布尔值 true 和 false。
5)break 语句用于终止最近的封闭循环或它所在的 switch 语句。
控制传递给终止语句后面的语句(如果有的话)。
6)byte 关键字代表一种整型,该类型按下表所示存储值7)switch 语句是一个控制语句,它通过将控制传递给其体内的一个 case 语句来处理多个选择和枚举。
例如:8)try-catch 语句由一个 try 块后跟一个或多个 catch 子句构成,这些子句指定不同的异常处理程序。
引发异常时,公共语言运行时(CLR) 会查找处理此异常的 catch 语句。
如果当前执行的方法不包含这样的 catch 块,则 CLR 会查看调用当前方法的方法,然后会遍历调用堆栈。
如果找不到 catch 块,则 CLR 会向用户显示一条有关未处理异常的消息并停止执行程序。
try 块包含可能导致异常的保护代码。
该块一直执行到引发异常或成功完成为止。
例如,下列强制转换null 对象的尝试引发NullReferenceException 异常9)char 关键字用于声明下表所示范围内的Unicode 字符。
Unicode 字符是16 位字符,用于表示世界上大多数已知的书面语言。
10)checked 关键字用于对整型算术运算和转换显式启用溢出检查。
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#关键字详解
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类型的代码!!!}}显式类型转换符必须通过类型转换调用。
c++32个关键字详解
C++ 标准(例如 C++17)定义了一系列关键字,这些关键字在语言中具有特殊的含义,不能被用作标识符或其他用途。
以下是 C++ 标准中的一些关键字,每个关键字都具有特定的语法和语义:1.alignas: C++11 引入的,用于指定内存对齐方式。
2.alignof: C++11 引入的,用于获取类型的对齐要求。
3.and: 逻辑与运算符。
4.and_eq: 位与赋值运算符。
5.asm: 用于嵌入汇编代码。
6.auto: C++11 引入的,用于自动类型推断。
7.bitand: 按位与运算符。
8.bitor: 按位或运算符。
9.bool: 布尔数据类型。
10.break: 用于跳出循环或 switch 语句。
11.case: 用于 switch 语句中的分支。
12.catch: 用于异常处理。
13.char: 字符数据类型。
14.char16_t: C++11 引入的,用于表示 UTF-16 字符。
15.char32_t: C++11 引入的,用于表示 UTF-32 字符。
16.class: 定义类。
pl: 位求补运算符。
18.const: 声明常量。
19.constexpr: C++11 引入的,用于指示表达式在编译时求值。
20.const_cast: 类型转换运算符,用于移除常量性。
21.continue: 继续下一轮循环。
22.decltype: C++11 引入的,用于获取表达式的类型。
23.default: C++11 引入的,用于指定 switch 语句的默认分支。
24.delete: C++11 引入的,用于删除函数或数组元素。
25.do: 循环语句的起始标志。
26.double: 双精度浮点数数据类型。
27.dynamic_cast: 运行时类型转换运算符。
28.else: 条件语句的分支。
29.enum: 枚举类型。
30.explicit: 显式构造函数关键字。
31.export: C++11 引入的,已废弃,不再使用。
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();}}}结果:紫霞仙子:神仙变妖怪?偷偷下凡即可。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
explicit构造函数
C++编程语言中有很多比较重要的关键字在实际编程中起着非常重要的作用。
我们今天为大家介绍的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;
上面的所有的C++ explicit关键字相关的操作即是所谓的"隐式转换"。
如果要避免这种自动转换的功能,这就是关键字explicit的作用了,将类的构造函数声明为"显式",也就是在声明构造函数的时候前面添加上explicit即可,这样就可以防止这种自动的转换操作,如果我们修改上面的MyClass类的构造函数为显式的,那么下面的代码就不能够编译通过了,如下所示:
class MyClass
{
public:
explicit MyClass( int num );
}
//.
MyClass obj = 10; //err,can't non-explict convert
以上就是对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。