我不是笔记的创造者,我只是笔记的搬运工~
1 ,构造函数可以重载,也可以带有缺省参数
匹配string的无参构造函数
string s;
匹配string的有参(const char*)构造函数
string s("hello");
2 ,缺省构造函数(无参构造函数)
1)如果类中没有定义任何构造函数,编译器会为该类提供一个缺省(无参)构造函数:
--》对于基本类型成员变量不做初始化
--》对于类 类型的成员变量(成员子对象),将会自动调用相应类的无参构造函数来初始化
2)如果自己定义了构造函数,无论是否有参数,那么编译器都不会再提供缺省的无参构造函数了.
3 ,类型转换构造函数(单参构造函数) //构造函数的类型转换
class 类名{
//可以将源类型变量转换为当前类类型对象.
类名(源类型){...}
};
-----------------------------------
class 类名{
//加“explicit”关键字修饰,可以强制要求这种类型
//转换必须显式的完成.
explicit 类名(源类型){...}
};
4, 拷贝构造函数(复制构造函数) 这部分我觉得还挺难理解的
1)用一个已存在的对象作为同类对象的构造实参,创建新的副本对象时,会调用该类拷贝构造函数。
class 类名{
类名(const 类名&){//拷贝构造
...
}
};
------------
eg:
class A{...};
A a1(...);
A a2(a1);//匹配A的拷贝构造函数
2)如果一个类没有自己定义拷贝构造函数,那么编译器会为该类提供一个缺省的拷贝构造函数:
--》对于基本类型的成员变量,按字节复制
--》对于类类型的成员变量(成员子对象),将自动调用相应类的拷贝构造函数来初始化
注:一般不需要自己定义拷贝构造函数函数,因为编译器缺省提供的已经很好用了.
class A1{};//缺省无参,缺省拷贝
class A2{//缺省拷贝
A(void){}
};
class A3{//缺省拷贝
A(int){}
};
class A4{//没有缺省构造
A(const A&){}
};
3)拷贝构造函数调用时机
--》用一个已存在对象作为同类对象的构造实参
--》以对象形式向函数传递参数
--》从函数中返回对象(有可能被编译器优化掉)