//#include <iostream> //using namespace std; #include <Windows.h> class student { public: student(){OutputDebugStringA("student()\n");} /*explicit */student(const char* s){OutputDebugStringA("student(const char* s)\n");} student(const student& stu){OutputDebugStringA("student(const student& stu)\n");} student& operator = (const student& stu){OutputDebugStringA("student& operator = (const student& stu)\n"); return *this;} };
int main() { student s1; OutputDebugStringA("\n"); student s2("11"); OutputDebugStringA("\n"); student s3 = "11"; OutputDebugStringA("\n"); student s4 = s3; OutputDebugStringA("\n"); student s5; s5 = "11"; OutputDebugStringA("\n"); student s6; s6 = s5; return 0; }
输出为:
student() student(const char* s) student(const char* s) student(const student& stu) student() student(const char* s) student& operator = (const student& stu) student() student& operator = (const student& stu)
这样的结果我可以理解, 但是如果将代码中的注释去掉,编译的时候 student s3 = "11"; 就出错了, 但是这个不是调用的是 student(const char* s)吗? 这个没有隐式转换啊,为什么会出错呢?
提示是:
error C2440: 'initializing' : cannot convert from 'const char [3]' to 'student'
explicit是~防止! 隐式转型。Google一下吧。
不加的时候, 是相当于student s3 =student("11");还是student s3("11"); ?
如果你把注释去掉了,那么explicit起到作用,就会禁止隐式转换。student s3 = "11"当然编译不通过了,只能用student s3 =student("11");或者student s3{"11"};
不加的时候, 是相当于student s3 =student("11");还是student s3("11"); ? 或者说student s3 =student("11");和student s3("11");是否为一样的?
@likebeta: student s3 =student("11")和student s3("11")和student s3{"11"}这三种表达方式是等价的,不管有没有expliciti都可以用。而student s3="11",右边值是一个字符串,但是左边s3是一个对象,所以它有一个隐式的转换。加上explicit之后相当于禁止了这种转换。