[C++] explicit关键字使用方法
2023-09-27 14:26:23 时间
C++中,构造函数可以用作自动类型转换,但是这种转换不一定是程序所需要的,有时会导致错误的类型转换。
下面的代码,在mian函数中,将一个整形赋值为对象类型。
#include "iostream" using namespace std; class Student { private: int a; public: Student(int tmp) { this->a = tmp; } void print() { cout << a << endl; } }; int main(void) { // 标准赋值 Student stu1(123); // 隐式赋值 Student stu2 = 123; stu1.print(); stu2.print(); return 0; }
上面的代码可以正常编译运行,输出123,456
因为普通构造函数能够被隐式的调用,编译器就自动调用这个构造器。
虽然隐式转换有方便之处,但是除非特意设计,否则隐式转换常常带来程序的逻辑错误,而且这种错误发生了很难查找。
explicit 关键字,就是为了防止类型错误转换,禁止构造函数在隐式转换中使用。
建议所有构造函数都添加 explicit 关键字,当真正需要转换时再删除 explicit
下面的代码,添加了 explicit 关键字,就会编译报错
#include "iostream" using namespace std; class Student { private: int a; public: // 禁止隐式转换 explicit Student(int tmp) { this->a = tmp; } void print() { cout << a << endl; } }; int main(void) { Student stu = 456; stu.print(); return 0; }
相关文章
- c++中cin的基本使用方法
- C/C++fflush(stdout)循环打印输出避免缓存区错误
- 小米面试——C++开发岗位
- 将C/C++程序的变量数据导入到MATLAB中的方法
- 23 C++ - 多个对象构造和析构
- 17 C++ - 函数的占位参数
- Python调用C/C++的种种方法
- 《C++程序设计教程(第3版)》——第3章,第1节传统的输入输出函数实现方法
- C++程序开启大地址(虚拟内存),让32位程序使用4G内存的方法,虚拟内存概念及寻址范围详解
- C++如何调用父类的方法?
- c++中关于SQLite中文乱码的解决方法
- C++中常见的字符判断与处理方法
- 《C++面向对象高效编程(第2版)》——1.6 什么不是类
- 《从缺陷中学习C/C++》——6.9 重复申请内存未释放
- 《C++编程惯用法——高级程序员常用方法和技巧》——第1章 抽象
- 《C++编程惯用法——高级程序员常用方法和技巧》——1.6 问题
- 《好学的C++程序设计》——第1章 概论
- c++11 跨平台多线程demo和qt 静态链接(std::thread有join函数,设置 QMAKE_LFLAGS = -static)
- C 和 C++ 的标准库分别有自己的 locale 操作方法,C 标准库的 locale 设定函数是 setlocale(),而 C++ 标准库有 locale 类和流对象的 imbue() 方法(gcc使用zh_CN.GBK,或者zh_CN.UTF-8,VC++使用Chinese_People's Republic of China.936或者65001.)
- C++中回调(CallBack)的使用方法(其实就是类方法指针,我觉得你的方法易用性不好,虽然原理正确)
- c++容器vector使用方法总结
- C++ 输出代码所在的文件、行数以及函数名称
- 【华为OD机试java、python、c++、jsNode】新学校选址(100%通过+复盘思路)
- 192、【动态规划】leetcode ——64. 最小路径和:回溯法+动态规划(C++版本)
- 165、【动态规划】leetcode ——337. 打家劫舍 III:记忆化递归+动态规划(C++版本)
- C++ 让控制台运行到最后按下回车键才结束的3种方法
- Reverse反转算法+斐波那契数列递归+Reverse反转单链表算法--C++实现
- C/C/C++中暂停调试的三种方法C++中暂停调试的三种方法
- Stuck in the process of compiling C++ extensions 卡住解决方法 time.sleep(self.wait_seconds)