C++ explict关键词详解
来源:互联网 发布:犹大福音 知乎 编辑:程序博客网 时间:2024/06/02 02:06
C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显式的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况
听得有点云里雾里~~直接上代码
class CxString // 没有使用explicit关键字的类声明, 即默认为隐式声明 { public: char *_pstr; int _size; CxString(int size) { _size = size; // string的预设大小 _pstr = malloc(size + 1); // 分配string的内存 memset(_pstr, 0, size + 1); } CxString(const char *p) { int size = strlen(p); _pstr = malloc(size + 1); // 分配string的内存 strcpy(_pstr, p); // 复制字符串 _size = strlen(_pstr); } // 析构函数这里不讨论, 省略... }; // 下面是调用: CxString string1(24); // 这样是OK的, 为CxString预分配24字节的大小的内存 CxString string2 = 10; // 这样是OK的, 为CxString预分配10字节的大小的内存 CxString string3; // 这样是不行的, 因为没有默认构造函数, 错误为: “CxString”: 没有合适的默认构造函数可用 CxString string4("aaaa"); // 这样是OK的 CxString string5 = "bbb"; // 这样也是OK的, 调用的是CxString(const char *p) CxString string6 = 'c'; // 这样也是OK的, 其实调用的是CxString(int size), 且size等于'c'的ascii码 string1 = 2; // 这样也是OK的, 为CxString预分配2字节的大小的内存 string2 = 3; // 这样也是OK的, 为CxString预分配3字节的大小的内存 string3 = string1; // 这样也是OK的, 至少编译是没问题的, 但是如果析构函数里用free释放_pstr内存指针的时候可能会报错, 完整的代码必须重载运算符"=", 并在其中处理内存释放
"CxString string2 = 10;" 这句为什么是可以的呢? 在C++中,如果的构造函数只有一个参数时, 那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象. 也就是说 "CxString string2 = 10;" 这段代码,编译器自动将整型转换为CxString类对象。
相当于:
CxString string2(10); 或 CxString temp(10); CxString string2 = temp;
加上explict后:
class CxString // 使用关键字explicit的类声明, 显示转换 { public: char *_pstr; int _size; explicit CxString(int size) { _size = size; // 代码同上, 省略... } CxString(const char *p) { // 代码同上, 省略... } }; // 下面是调用: CxString string1(24); // 这样是OK的 CxString string2 = 10; // 这样是不行的, 因为explicit关键字取消了隐式转换 CxString string3; // 这样是不行的, 因为没有默认构造函数 CxString string4("aaaa"); // 这样是OK的 CxString string5 = "bbb"; // 这样也是OK的, 调用的是CxString(const char *p) CxString string6 = 'c'; // 这样是不行的, 其实调用的是CxString(int size), 且size等于'c'的ascii码, 但explicit关键字取消了隐式转换 string1 = 2; // 这样也是不行的, 因为取消了隐式转换 string2 = 3; // 这样也是不行的, 因为取消了隐式转换 string3 = string1; // 这样也是不行的, 因为取消了隐式转换, 除非类实现操作符"="的重载
第二种初始化方式会产生错误~,因为explicit关键字的作用就是防止类构造函数的隐式自动转换.
说明:
- explicit关键字只对有一个参数的类构造函数有效, 如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就无效了
- 当除了第一个参数以外的其他参数都有默认值的时候, explicit关键字依然有效
阅读全文
0 0
- C++ explict关键词详解
- explict
- explict
- C/C++ extern 关键词详解
- C++关键字explict的详解和使用
- C++关键字explict的详解和使用
- C语言32关键词分类详解
- C++ explict
- C++ explict
- C++ explict
- extern关键词详解
- C#--关键词提取算法
- c语言关键词
- C语言关键词
- C#params关键词用法
- C语言易混淆关键词详解-const, static, extern, typedef, 声明
- C语言易混淆关键词详解-const, static, extern, typedef, 声明
- C语言易混淆关键词详解-const, static, extern, typedef, 声明
- Spark性能调优——基础篇
- 09-面向对象(异常-finally代码块) 10-面向对象(异常-异常应用)1 2 3 4 11-面向对象(异常-异常注意事项)
- Merge k Sorted Lists
- Gaclib 小白使用教程(1)
- 前端基础学习(一)10.30--11.1
- C++ explict关键词详解
- 《智能时代》读书笔记
- SolrCloud 集群详解
- 【剑指offer】11-20题
- 小浮动
- 与IP地址相关的几个结构体
- Spring之IOC
- cqbzoj3474 信仰(hineven模拟赛t3,Hash出奇迹)
- 【剑指offer】21-30题