C++之explicit关键字使用总结
来源:互联网 发布:玉米田间调查数据 编辑:程序博客网 时间:2024/06/06 00:24
1、explicit关键字介绍
C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).
2、贴代码
#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>using namespace std;class Stest{ public: char *_pstr; int _size;// explicit Stest(int size) Stest(int size) { _size = size; _pstr =(char *)malloc(size + 1); memset(_pstr, 0, size + 1); } Stest(const char* p) { int size = strlen(p); cout<<"size"<<size<<endl; _pstr = (char *)malloc(size + 1); strcpy(_pstr, p); _size = strlen(_pstr); cout<<"_size"<<size<<endl; }};int main(){ Stest s; Stest s1(30); Stest s2 = 5; Stest s3("chenyu"); Stest s4 = 'a'; Stest s5 = s3; return 0;}
3、分析代码
1)在构造方法Stest(int size)前面没有加上explicit时,结果如下
Stest s; //fail Stest s1(30); //success Stest s2 = 5; //success Stest s3("chenyu"); //success Stest s4 = 'a'; //success Stest s5 = s3; //successStest s是由于没有定义默认的构造函数
Stest s2 = 5能执行成功是因为在C++中, 如果的构造函数只有一个参数时, 那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象. 也就是说 "Stest string2 = 10;" 这段代码, 编译器自动将整型转换为CxString类对象, 实际上等同于下面的操作:
Stest s2(5); 或 Stest temp(5); Stest s2 = temp;
'a'实际也是一个数字
2)在构造方法Stest(int size)前面加上explicit时,结果如下
Stest s; //fail Stest s1(30); //success Stest s2 = 5; //fail Stest s3("chenyu"); //success Stest s4 = 'a'; //fail Stest s5 = s3; //success
explicit关键字的作用就是防止类构造函数的隐式自动转换.
explicit关键字只对有一个参数的类构造函数有效, 如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就无效了
Stest(int size, int money)
也有一个例外, 就是当除了第一个参数以外的其他参数都有默认值的时候, explicit关键字依然有效, 此时, 当调用构造函数时只传入一个参数, 等效于只有一个参数的类构造函数
Stest(int size, int money = 0)
0 0
- C++之explicit关键字使用总结
- extern “C”总结 C++中的explicit关键字
- C++:explicit 关键字
- C++explicit关键字
- 【C++】explicit关键字
- C++explicit关键字
- 【C++】explicit关键字
- 【C++】explicit关键字
- 【C++】explicit关键字
- C++关键字之explicit
- C++关键字之explicit
- c++关键字之explicit
- C++关键字之:explicit
- C++关键字之explicit
- C++关键字之explicit
- C++关键字之explicit
- explicit关键字的使用
- explicit 关键字的使用
- 解决跨域访问
- 第一个Spring MVC应用
- Windows R语言环境配置
- scribble semantic segmentation
- Android -- 源码平台下JAR包的引入与编译
- C++之explicit关键字使用总结
- Java基础学习(七)
- 在Windows下Python使用SSH若干事
- EXCEL2003、2007查找后变色显示
- 深入了解Bitmap源码解析及经验总结
- 基于注解的Spring MVC控制器
- linux的终端,网络虚拟终端,伪终端
- 给QWidget添加工具栏
- 2.定时器