C++ 关键字explicit的使用场景
假若我们定义了Str类如下结构
class Str
{
public:
Str(int n)
Str(const char* p)
.....
}
可以使用如下方式来构建一个对象
Str c(12);
Str d=Str(20);
Str *z=new Str(21);
Str a=10;//此处构建10个大小的空间
Str b="abcd";//此处构建特定字符串大小空间
Str f='f'; //与设计不相符的构建方式,这里会构建(int)'f'大小的内存空间
也许调用者是希望Str存'f'这一个字符,尽管Str没有提供这样的接口,但是编译的时候并不会报错,因为这里存在隐式转换,将char型转换为Int型,这样就与调用者的初衷不符合了。而使用explicit可以杜绝这种隐式转换,在编译的时候就不会让其通过。可见explicit对于写一些基础库供他人调用还是非常有必要的.
代码:
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 | #include<iostream> using namespace std; class Str { public : /* explicit*/ Str( int n) //try explicit here { capacity=n; getmem(); } Str( const char * p) { capacity= strlen (p)+1; getmem(); strcpy (strarr,p); } ~Str() { if (strarr!=NULL) free (strarr); } void printfvalue() { cout<< "len:" <<capacity<< " str:" <<strarr<<endl; } private : void getmem() { strarr=( char *) malloc ( sizeof ( char )*capacity); } private : int capacity; char *strarr; }; int main() { Str c(12); Str d=Str(20); Str *z= new Str(21); Str a=10; Str b= "abcd" ; Str f= 'f' ; c.printfvalue(); d.printfvalue(); z->printfvalue(); a.printfvalue(); b.printfvalue(); f.printfvalue(); return 1; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?