大部分对象在使用之前没有正确的初始化是C++出错的主要领域 引入类的构造函数是正确的初始化类的对象 一般什么时候触发并调用类的构造函数呢? 答案是:当我们用类来定义一个类变量的时候, 如: class demo{.....}; 声明并定义好完整的类 //当我们用类去建立一个对象时,它首先调用类的构造函数 demo d; //调用类的无参数的构造函数 demo d1(参数1,..) //按参数个数不同,调用类中不同的构造函数 2.定义 构造函数名和类名完全一样,可以根据不同的参数来实现重载不同的构造函数 构造函数是没有任何返回值的,它默认的是public,inline函数 2.1定义格式 构造函数可以重载,可以是无参数,有参数,有默认参数) 声明三个构造函数 代码如下 class item{ public: item(std::string& book="" ); //带默认形参的构造函数 item(std::string& ); //带形参的构造函数 item(); //无形参的构造函数 }; 2.2构造函数的两种初始化成员变量的方法 如下面的类 class demo(){ public: //构造函数在下面添加 private: int x; int y; std::string name; }; 构造函数初始化成员有两种方法 A.使用构造函数的初始化列表进行初始化 格式:funname(参数列表):(初始化列表){} 初始化列表: 成员名1(形参名1),成员名2(形参名2),成员名n(形参名n) 代码: demo(int a=0,int b=0,std::string s=""):x(a),y(b),name(s){} B.使用构造函数的函数体进行初始化 格式:funname(参数列表){函数体内赋值} 它和传统的C函数差不多 代码: demo(int a=0,int b=0,std::string s=""){ x=a; y=b; name=s; } 3.基类与派生类 3.1在基类用构造函数初始化类的成员 "默认形参的方式+初始化列表"来初始化基类,而参数顺序不是主要的 代码如下: class item_base( public: //两个构造函数 item_base():(isbn(""),price(0.0){} item_base(std::string& book="",double s_price=0.0) //带默认形参 :isbn(book),price(s_price){} //初始化列表 ...... private: std::string book; double price ); 3.2派生类 由于初始化顺序是从基类到派生类的 基类的构造函数负责初始化基类与派生类的构造数负责初始化派生类, 在MFC中N层继承类库中,都是不同层中的类负责初始化自己本身和调用上一级构造函数进行初始化 如何在派生类初始化从基类中继承来的protected成员和基类的private成员呢? 答案是: 在派生类的构造函数间接的调用基类构造函数来实现,派生类的初始化列表必须明确指出基类的初始化式
|