十四 、构造函数和初始化列表
1 构造函数可以重载,也可以带有缺省参数
//匹配string的无参构造函数
string s;
//匹配string的有参(const char*)构造函数
string s(“hello”);
---------------------------------
//C++标准库网址
http://www.cplusplus.com/
2 缺省构造函数(无参构造函数)
1)如果类中没有定义任何构造函数,编译器会为该类提供一个缺省(无参)构造函数:
–》对于基本类型成员变量不做初始化
–》对于类 类型的成员变量(成员子对象),将会自动调用相应类的无参构造函数来初始化
2)如果自己定义了构造函数,无论是否有参数,那么编译器都不会再提供缺省的无参构造函数了.
#include <iostream>
using namespace std;
class Integer{
public:
//无参构造函数
Integer(void){
m_i = 0;
}
//int->Integer
/*explicit*/ //显示的转换 - 关键字
Integer(int i){
cout << "类型转换构造函数" << endl;
m_i = i;
}
void print(void){
cout << m_i << endl;
}
private:
int m_i;
};
int main(void){
Integer i;
i.print();//0
//1)通过类型转换构造函数将100转为Integer对象,转换结果会保存到一个临时对象中
//2)再使用临时对象对i进行赋值操作
i = 100;
i.print();//100
//上面代码可读性差,推荐使用下面显式转换
//i = (Integer)200;//C风格
i = Integer(200);//C++风格
i.print();//200
return 0;
}
3 类型转换构造函数(单参构造函数)
class 类名{
//可以将源类型变量转换为当前类类型对象.
类名(源类型){...}
};
-----------------------------------
class 类名{
//加“explicit”关键字修饰,可以强制要求这种类型
//转换必须显式的完成.
explicit 类名(源类型){...}
};
/*explicit*/ //显示的转换 - 关键字
Integer(int i){
cout << "类型转换构造函数" << endl;
m_i = i;
}
4 拷贝构造函数(复制构造函数)
1)用一个已存在的对象作为同类对象的构造实参,创建新的副本对象时,会调用该类拷贝构造函数。
class 类名{
类名(const 类名&){//拷贝构造
…
}
};
------------
eg:
class A{…};
A a1(…);
A a2(a1);//匹配A的拷贝构造函数
代码:
#include <iostream>
using namespace std;
class A{
public:
A(int data =</