C++关键字之explicit(显式)

C++ Code


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
 
/*

KeyWord_explicit.cpp

C++关键字:explicit(显示)

Author: Michael Joessy

Date: 2017-06-07

Marks:

在C++程序中很少有人去使用explicit关键字,不可否认,在平时的实践中确实很少能用的上。

再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决。

但稍微留心一下就会发现现有的MFC库或者C++标准库中的相关类声明中explicit出现的频率是很高的。

了解explicit关键字的功能及其使用对于我们阅读使用库是很有帮助的;而且在编写自己的代码时也可以尝试使用。

既然C++语言提供这种特性,我想在有些时候这种特性将会非常有用。

按默认规定,只用传一个参数的构造函数也定义了一个隐式转换。

原则上应该在所有的构造函数前加explicit关键字,当你有心利用隐式转换的时候再去解除explicit,这样可以大大减少错误的发生。

*/

#include <iostream>

using namespace std;

class classA

{

public:

classA();

explicit classA(int x, int y = 23);

~classA();

private:

int m_x;

int m_y;

};

classA::classA()

{

}

classA::classA( int x, int y /*= 23*/ )

{

m_x = x;

m_y = y;

}

classA::~classA()

{

}

int main(void)

{

classA ca1;

classA ca2(12, 24);

classA ca3(35);

classA ca4 = 18;  // 执行了隐式转换,这个地方调用了编译器为我们提供的默认复制构造函数

// 对于某些类型,这一情况非常理想。

// 但在大部分情况中,隐式转换却容易导致错误(不是语法错误,编译器不会报错)。

// 隐式转换总是在我们没有察觉的情况下悄悄发生,除非有心所为,隐式转换常常是我们所不希望发生的。

// 通过将构造函数声明为explicit(显式)的方式可以抑制隐式转换。

// 也就是说,explicit构造函数必须显式调用。

/* Error

1>error C2440: ‘initializing‘ : cannot convert from ‘int‘ to ‘classA‘

1>        Constructor for class ‘classA‘ is declared ‘explicit‘

*/

cin.get();

return 0;

}

时间: 2024-10-07 05:02:28

C++关键字之explicit(显式)的相关文章

c# implicit explicit关键字(隐式和显式数据类型转换)

implicit关键字用于声明隐式的用户定义类型转换运算符.(explicit反之)explicit则用于显示转换用户自定义类型.static implicit operator target_type ( source_type identifier ){......}隐式转换可以通过消除不必要的类型转换来提高源代码的可读性.但是,因为可以在未指定的情况下发生隐式转换,因此必须注意防止令人不愉快的后果. 一般情况下,隐式转换运算符应当从不引发异常并且从不丢失信息,以便可以在不知晓的情况下安全使

C++ Primer 学习笔记_18_类与数据抽象(4)_构造函数、析构函数、explicit关键字、赋值与初始化、类成员的显式初始化

引言: 构造函数确保每个对象在创建时自动调用,以确保每个对象的数据成员都有合适的初始值. 一.构造函数.默认构造函数 1.构造函数 --构造函数是特殊的成员函数 --构造函数是为了保证对象的每个数据成员都被正确初始化 --函数名和类名完全相同 --不能定义构造函数的类型(返回类型),也不能使用void --通常情况下构造函数应声明为公有函数,一般被隐式地调用. --构造函数被声明为私有有特殊的用途,比如单例模式. (1).构造函数可以被重载 一般而言,不同的构造函数允许用户指定不同的方式来初始化

C++中显式、隐式与explicit关键字

在Qt的开发中看到explicit,由此展开搜索. 隐式:编译器完成的转换,如 int a = 1; float b = 3; float sum; sum = a + b; //a本是int,编译器将a隐式地转化为了float 显式:用户完成的转换,如 float a=1; float b=3; int s; s = (int)a+(int)b;//a与b被显式地转化为了float 对于函数而非数据,这里有另一个例子[引用]: #include <iostream> using namesp

(转载)Android理解:显式和隐式Intent

Intent分两种:显式(Explicit intent)和隐式(Implicit intent). 一.显式(设置Component) 显式,即直接指定需要打开的activity对应的类. 以下多种方式都是一样的,实际上都是设置Component直接指定Activity类的显式Intent,由MainActivity跳转到SecondActivity: 1.构造方法传入Component,最常用的方式 Intent intent = new Intent(this, SecondActivit

模板显式、隐式实例化和(偏)特化、具体化的详细分析(转)

这么多叫法,其实就是三种. 1. 显示实例化 2. 隐式实例化 3. 特化(=具体化).偏特化 一.实例化 1.显示.隐式实例化 什么是实例化:一个通过使用具体值替换模板参数,从模板产生的普通类,函数或者成员函数的过程. 显示实例化:通过名字可见,就是清楚的表明你要实例化的类型 隐式实例化:通过编译器自己推测判断要实例化的类型. 比如一个模板: template<class T> //函数模板实现  void swap(T &a, T &b) {     T temp;    

C++学习笔记36 模版的显式具体化和显式实例化

C++的模版有时候很可能无法处理某些类型. 例如: #include <iostream> using namespace std; class man{ private: string name; int data; public: man(string s,int i):name(s),data(i){ } void show()const{ cout<<"this name is "<<name<<" ,data=&quo

显式Intent与隐式Intent的功能与使用方法解析。

显式Intent与隐式Intent的功能与使用方法解析. Intent,在中文中的意思是意图.就是想要做的事. 而使用startActivity(Intentintent)或者startActivityForResult(Intentintent)或者别的使用它的方法,形象地说就是指  去做你想要做的事.(do what you want to do) 首先,大体的介绍一下它们的使用差别: 1.Explicit Intent(显式意图):主要用于调用自身应用程序的组件(activity,serv

android中的显式与隐式Intent

Intent是Android初学者比较难理解的一个东西.我这里以通俗易懂的语言和通俗易懂的代码,让初学者简单感受一下Intent. intent就是意图的意思.Intent分两种:显式(Explicit intent)和隐式(Implicit intent). 一.显式(设置Component) 显式,即直接指定需要打开的activity对应的类.以下多种方式都是一样的,实际上都是设置Component直接指定Activity类的显式Intent,由MainActivity跳转到SecondAc

VBScript学习笔记 - 作用域,变量显式声明

<p>在脚本主体中声明或创建一个变量时,默认是全局作用域(global scope)的:而在函数或子例程中定义的变量,默认是私有作用域(private scope)的.</p><p>要显式声明变量的作用域,可用public语句和private语句</p><div class="cnblogs_code" style="border-top: #cccccc 1px solid; border-right: #cccccc