baidut
11/12/2014 - 8:00 AM

构造函数

构造函数

#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