最近这段时间因为开学所以一直没有更新,最近同时在学习C++所以现在才开始步入正轨后面会保持更新抱歉啊 后面可能会更新QT类的游戏
话不多说代码奉上
构造函数
构造函数长什么样子
函数名和类名相同
没有返回值
如果不写构造函数,任何类中都存在一个默认的构造函数
默认的构造函数时无参的
当我们自己写了构造函数,默认的构造函数不存在
构造函数在构造对象的时候调用
delete可以用来删掉默认的构造函数
指定使用默认的无参构造函数,使用default
允许构造函数调用另一个构造函数,只是要用初始化参数列表的写法
初始化参数列表:只有构造函数有
构造函数名(参数1,参数2,.......):成员1(参数1),成员2(参数2),.......{}
避免形参名和数据成员名相同的导致问题
构造函数干嘛的
构造函数用来构造对象
构造函数更多是用来初始化数据成员
思考题?
为什么不写构造函数可以构建对象?是因为存在默认的无参构造函数,所以可以构建无参对象
构造函数重载为了什么?为了构造不同长相的对象。
#include析构函数#include using namespace std; class MM { public: //MM() = delete; //删掉默认的构造函数 MM(string mmname, int mmage) { name = mmname; age = mmage; cout << "带参构造函数" << endl; } //MM() //{ // cout << "无参构造函数" << endl; //} MM() = default; //使用的是默认无参构造函数 void print() { cout << name << "t" << age << endl; } protected: string name = "lisa"; int age = 18; }; //为了能够构造不同长相的对象,我们会给构造函数缺省处理 class Boy { public: //上面函数 等效可以实现下面三个函数的功能 Boy() {} Boy(string bname) { name = bname; } //出错:没有与之匹配的构造函数 Boy(string bname, int bage) { name = bname, age = bage; } protected: string name; int age; }; //初始化参数列表的写法 string girlNme = "baby"; class Student { public: Student(string mname = "", int mage = 18) :name(mname), age(mage) { cout << "初始化参数列表" << endl; //继承和类的组合必须采用初始化参数列表写法 } Student(int mage) :name(girlNme), age(mage) {} void print() { cout << name << "t" << age << endl; } protected: string name; int age; }; //构造函数可以调用另一个构造函数初始化数据 class TT { public: TT(string name, int age) :name(name), age(age) {} //委托构造:允许构造函数调用另一个构造函数 TT():TT("默认",18) {}//没有给数据初始化 void print() { cout << name << "t" << age << endl; } protected: string name; int age; }; int main() { //MM mm; //构造无参的对象,需要无参构造函数 MM mm("mm", 28); mm.print(); MM girl; girl.print(); Boy boy1; Boy boy2("流浪之子"); Boy boy3("小王子",18); Student student1(18); Student student2("mm", 19); student1.print(); student2.print(); TT tt; tt.print(); return 0; }
析构函数长什么样子
无返回值
无参数
函数名:~类名
不写的话会存在默认的析构函数
析构函数不需要自己调用,对象死亡的之前会调用析构函数
析构函数用来干嘛?(什么时候需要自己手动写析构函数)
当类中的数据成员是指针,并且动态申请的内存就需要手写析构
析构函数用来释放数据成员申请动态内存
#define _CRT_SECURE_NO_WARNINGS #include#include #include using namespace std; class MM { public: MM(const char* pstr, int age) :age(age) { str = new char[strlen(pstr) + 1]; strcpy(str,pstr); } void print() { cout << str << "t" << age << endl; } ~MM(); protected: char* str; int age; }; MM::~MM() //~MM::MM() { cout << "我叫做析构函数" << endl; delete[] str; } int main() { { MM mm("张三", 18); mm.print(); //mm.~MM()//手动调用会导致二次释放问题 } cout << "主函数" << endl; //new一个对象的时候,只有delete才会调用析构函数 { MM* project = new MM("baby", 12); //project->~MM(); delete project; //释放一段内存 delete[] p ------- delete[] p } return 0; }



