C++封闭类及其初始化(构造函数和初始化列表的使用)
//program 12.6.1.cpp 封闭类 #include <iostream> using namespace std; class CTyre //轮胎类 { private: int radius; //半径 int width; //宽度 public: /*非封闭类也可以使用 初始化列表 来初始化本类的成员变量。*/ CTyre(int r/*传给本类的成员变量radius*/,int w/*传给成员变量width*/):radius(r),width(w)/*这系普通类初始化的另一种方式*/ { cout << "CTyre(int r,int w) was called!" << endl; cout << "radius = " << radius << "," << "width = " << width << endl; } }; class CEngine //引擎类 { public: CEngine() { cout << "The defult constructor function CEngine() was called!" << endl; } }; class CCar { //汽车类 private: int price; //价格(原生基础类型成员) CTyre tyre;/*引入其他类实例化的对象,它的初始化需要调用对应的外部类的构造函数*/ CEngine engine;/*这个成员对象同理*/ public: CCar(int p,int tr,int tw ); }; /*类名(指封闭类名)::封闭类的构造函数名(参数表):成员变量1(参数表),成员变量2(参数表),..*/ /*封闭类CCar的构造函数CCar(...); 初始化列表 :(可以只添加部分)*/ CCar::CCar(int p/*用于初始化price成员变量*/, int tr,int tw/*用来初始化tyre成员对象的*/ /*没有为CEngine类型的 engine成员对象提供初始化参数,那么编译器会尝试用默认CEngine类的无参默认构造函数去初始化engine成员对象*/): /*初始化列表:*/ price(p)/*price成员是CCar对象的原生基础类型成员,本语句使得本类的price成员变量值=p*/, tyre(tr, tw)//初始化列表结束。 { cout << "完成对封闭类的各成员变量和成员对象的初始化" << endl; };//封闭类CCar的构造函数CCar(...) int main() { CCar car(20000,17,225); return 0; } /*CCar是个封闭类,有tyre和engine两个成员对象。编译器需要弄明白,car对象中的tyre和engine成员对象该如何初始化。 编译器已经知道这里的car对象是用上面的CCar(int p,int tr,int tw)构造函数初始化的; 那么tyre和engine这两个引自外部的成员对象该如何初始化,就要看CCar(int p,int tr,int tw)后面的:初始化列表 了。 初始化:初始化某个类一般指的是初始化类当中的 成员变量以及成员对象 封闭类的初始化列表(位于构造函数后)的目的主要是为了处理后者(成员对象), 当然普通的基础类型成员变量也能一并处理,列在初始化列表中 该初始化列表中交待了,tyre应以tr和tw作为参数调用CTyre(int r,int w)构造函数初始化,但是没有交待engine该怎么处理; 这种情况下,编译器就认为engine应该用CEngine类的无参构造丽数初始化。 而CEngine类确有一个编译器自动生成的默认无参构造丽数,因此,整个car对象的初始化问题就解决了。*/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了