栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C++构造和析构】个人笔记

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C++构造和析构】个人笔记

最近这段时间因为开学所以一直没有更新,最近同时在学习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;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/743934.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号