一、 构造函数和初始化表
1、构造函数可以重载
1)构造函数通过参数表的差别化形成重载关系,创建对象时通过构造实参类型选择匹配,表示不同的对象创建方式
2)可以适当使用缺省参数,减少构造函数重载版本数量,但注意不要和缺省参数构造歧义错误。
1#include<iostream>
2using namespace std;
3class student{
4public:
5 student(const string&name,int age,int no){
6 m_name=name;
7 m_age=age;
8 m_no=no;
9 }
10 student(const string& name){
11 m_name=name;
12 m_age=0;
13 m_no=0;
14 }
15 student(void){
16 m_name="无名";
17 m_age=0;
18 m_no=0;
19 }
20 void who(void){
21 cout<<"我叫"<<m_name<<",今年"<<m_age<<"岁"<<endl;
22 cout<<"学号"<<m_no<<endl;
23 }
24 private:
25 string m_name;
26 int m_age;
27 int m_no;
28};
29int main(void){
30 student s1("张飞",25,10086);
31 s1.who();
32 student s2("赵云");
33 s2.who();
34 student s3;//不要写小括号
35 //student s3=student();//OK 等价于上句
36 s3.who();
37 return 0;
38 }
等价于:
1#include<iostream>
2using namespace std;
3class student{
4public:
5 student(const string&name="无名",intage=0,int no=0){
6 m_name=name;
7 m_age=age;
8 m_no=no;
9 }
10#if 0
11 student(const string& name){
12 m_name=name;
13 m_age=0;
14 m_no=0;
15 }
16 student(void){
17 m_name="无名";
18 m_age=0;
19 m_no=0;
20 }
21#endif
22 void who(void){
23 cout<<"我叫"<<m_name<<",今年"<<m_age<<"岁"<<endl;
24 cout<<"学号"<<m_no<<endl;
25 }
26private:
27 string m_name;
28 int m_age;
29 int m_no;
30};
31int main(void){
32 student s1("张飞",25,10086);
33 s1.who();
34 student s2("赵云");
35 s2.who();
36 student s3;//不要写小括号
37 //student s3=student();//OK 等价于上句
38 s3.who();
39 return 0;
40 }
2、缺省构造函数
1) 如果一个函数没有定义构造函数,编译器会提供一个缺省的无参构造函数,使成员变量获得定义。
2) 对于基本类型的成员不做初始化
3) 对于类类型的成员变量(成员子对象),调用相应类型的无参构造函数初始化
1#include<iostream>
2using namespace std;
3class teacher{
4public:
5 void who(void){
6 cout<<m_name<<','<<m_