Effective C++学习笔记之explicit
关键字:
explicit意思为“明确的”和“清楚的”,是C++的关键词,意在阻止隐式类型的转换;
使用原因:
有时候不合法的隐式转换,会让乖巧听话的程序变得不可控。所以适当地使用explicit关键字是有必要的。
如 string str = 'a'; 这样的赋值是不能通过编译,错误原因是 invalid conversion from ‘char’ to ‘const char*,也就是“不能做隐式char->const char转换”。
注意事项:
1、只能用于类内部构造函数的声明前,不能用于类外部构造函数的实现前;
2、只能作用于构造函数的一个参数、或者有默认值的多个参数。
用途举栗:
现有一个testDog的函数,函参是一个Dog类的对象。Dog类只提供了一个设置成员变量age的构造函数。
1、传入name的构造函数,没有使用explicit关键字,直接对testDog传入一个string或者char *,也能得到想要的输出。其中隐式地将 "Huskie" 转换为一个“name = Huskie,age = 0”的Dog类对象。
2、传入age的构造函数,使用了explicit关键字,参数传入int型的2会编译不过,表示“不能做隐式int->Dog转换”。将Dog(2)当做函参传入就会解决此问题。
1 #include <iostream> 2 using namespace std; 3 4 class Dog 5 { 6 public: 7 string name; 8 int age; 9 10 explicit Dog(int age_) 11 { 12 name = "Huskie"; 13 age = age_; 14 } 15 Dog(const char* p) 16 { 17 name = p; 18 age = 0; 19 } 20 }; 21 22 void testDog(Dog onedog) 23 { 24 cout<<"Dog's name is :"<<onedog.name<<", age :"<<onedog.age<<endl; 25 } 26 27 int main() 28 { 29 string str = 'a';//invalid conversion from ‘char’ to ‘const char* 30 //即编译出错,不能做隐式char->const char转换 31 32 Dog dog1 = 2;//编译出错,不能做隐式int->Dog转换 33 Dog dog2 = "haha"; 34 35 cout<<"Test dog:"<<endl; 36 testDog("Shiba Inu"); 37 testDog(2);//编译出错,不能做隐式int->Dog转换 38 testDog(Dog(2)); 39 return 0; 40 }
分类:
Effective C++
标签:
Effective C++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?