构造函数
#include <iostream>
using namespace std;
class String{
public:
String(const String& s){ // 复制构造函数
cout << "@String(const String& s)" << endl ;
}
explicit String(int n){ // 必须显式构造的构造函数
cout << "@explicit String(int n)" << endl ;
}
String(const char *p){// 一般构造函数,只有一个参数时可以隐式构造,提供char*->String转换
cout << "@String(const char *p)" << endl ;
}
};
//String s0; // 编译错误:没有对应无参数的构造函数 error: no matching function for call to ‘String::String()’
//String s1 = 'a'; // 编译错误:不能做隐式char->String转换 error: initializing argument 1 of ‘String::String(const char*)’ [-fpermissive]
String s2(10); // @explicit String(int n)
String s3("Fawlty"); // @String(const char *p)
String s4 = String(10); // @explicit String(int n) 注意不会先调用String(int n)再调用默认的复制构造函数(原博客有误)
String s5 = String("Fawlty"); // @String(const char *p)
// 下面加上explicit关键字的作用************#
String s6 = "Brian"; // @String(const char *p) 隐式转换 不再调用复制构造
// String s7 = 10; // error: initializing argument 1 of ‘String::String(const char*)’ [-fpermissive]
// 为什么编译器弹出上面的error,因为需要隐式转换,explicit函数不支持,因此尝试调用String(const char*),但类型不匹配
// 去掉explicit就好了
// ****************************************#
String s8 = s2; // @String(const String& s)
int main() {
// your code goes here
// 只有初始化时可以这么写s2(10);s3("Fawlty");
cout << "main" << endl;
s5 = String(10); // @explicit String(int n),不会再调用复制构造
s6 = "Brian"; // @String(const char *p)
s4 = s3; // 初始化时调用复制构造函数,这里不会调用复制构造函数,而是简单的对象复制,内容拷贝。
return 0;
}
// 参考资料 :http://blog.csdn.net/chollima/article/details/3486230