构造函数与析构函数

Hello,友友们,我是你们的好朋友一一,今天一一想给大家分享一点关于构造函数和析构函数的知识点,欢迎大家批评指正!

 

1.初始化和清理       

        大家在购买一台电脑或者手机,或者其他的产品,这些产品都有一个初始设置,也就是这些产品对被创建的时候会有一个基础属性值。那么随着我们使用手机和电脑的时间越来越久,那么电脑和手机会慢慢被我们手动创建很多文件数据,某一天我们不用手机或电脑了,那么我们应该将电脑或手机中我们增加的数据删除掉,保护自己的信息数据。

       从这样的过程中,我们体会一下,所有的事物在起初的时候都应该有个初始状态,当这个事物完成其使命时,应该及时清除外界作用于上面的一些信息数据。

        那么在我们c++中具体来说,当我们创建对象的时候,这个对象应该有一个初始状态,当对象销毁之前应该销毁自己创建的一些数据。

        对象的初始化和清理也是两个非常重要的安全问题,一个对象或者变量没有初始时,对其使用后果是未知,同样的使用完一个变量,没有及时清理,也会造成一定的安全问题。c++为了给我们提供这种问题的解决方案,构造函数析构函数,这两个函数将会被编译器自动调用,完成对象初始化和对象清理工作。

        无论你是否喜欢,对象的初始化和清理工作是编译器强制我们要做的事情,即使你不提供初始化操作和清理操作,编译器也会给你增加默认的操作,只是这个默认初始化操作不会做任何事,所以编写类就应该顺便提供初始化函数。

        为什么初始化操作是自动调用而不是手动调用?既然是必须操作,那么自动调用会更好,如果靠程序员自觉,那么就会存在遗漏初始化的情况出现。

2.构造函数和析构函数

        构造函数主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用。

        析构函数主要用于对象销毁前系统自动调用,执行一些清理工作。

//构造函数: 没有返回值,不用写void,函数名与类名相同,可以有参数,可发生重载,由编译器自动调用,不用手动调用。
//析构函数: 没有返回值,不用写void,函数名与类名相同,函数名前面加~,不可以有参数,不可发生重载,由编译器自动调用,不用手动调用。
 

#include<iostream>
using namespace std;

//基本用法
class Person
{
    Person()
    {
        cout << "构造函数调用" << endl;

    }
    
    ~Person()
    {
        cout << "析构函数调用" << endl;
    }
};

void test(){};

int main()
{
    test();
    return 0;
}
//举例
class Person
{
public:
    Person()
    {
        cout << "构造函数调用" << endl;
        pname = (char*)malloc(sizeof("John"));
        strcpy(pname, "John");
        mtall = 188;
        mmoney = 200;
    }

    ~Person()
    {
        cout << "析构函数调用" << endl;
        if (pname != NULL)
        {
            free(pname);
            pname = NULL;
        }
    }
public:
    char* pname;
    int mtall;
    int mmoney;

};

void test()
{
    Person P;
    cout << P.pname << P.mtall <<P.mmoney << endl;
}

int main()
{
    test();
    return 0;
}

3.构造函数的分类及调用

  1. 按参数类型:分为无参构造函数和有参构造函数
  2. 按类型分类:普通构造函数和拷贝构造函数(复制构造函数)
    class Person
    {
    public:
    	Person() //无参构造函数
    	{
    		cout << "无参构造函数"<<endl;
    		mage = 0;
    	}
    	Person(int age)
    	{
    		cout << "有参构造函数" << endl;
    		mage = age;
    	}
    	Person(const Person & person)  //使用另一个对象初始化本对象
    	{
    		cout << "拷贝构造函数" << endl;
    		mage = person.mage;
    	}
    	void Printage()
    	{
    		cout << "AGE=" << mage << endl;
    	}
    private:
    	int mage;
    };
    
    
    
    //无参构造调用方式
    void test1()
    {
    	Person P;
    	P.Printage();
    
    }
    
    
    
    //有参构造调用方式
    
    //第一种方法:括号法
    void test2()
    {
    	Person P1(20);
    	P1.Printage();
    }
    
    //第二种方法:显示法
    void test3()
    {
    	Person P2 = Person(20);
    	P2.Printage();
    }
    //第三种方法:隐式类型转换法
    void test4()
    {
    	Person P3 = 20;
    	P3.Printage();
    }
    
    
    
    //拷贝构造函数调用方式:与有参构造类似,把括号里面的参数换成一个新的类
    void test5()
    {
    	Person P5;
    	Person P4(P5);
    	P4.Printage();
    }
    int main()
    {
    	test1();
    	test2();
    	test3();
    	test4();
    	test5();
    	return 0;
    }

    4.构造函数调用规则

    默认情况下,c++编译器至少为我们写的类增加3个函数

    默认构造函数(无参,函数体为空)

    默认析构函数(无参,函数体为空)

    默认拷贝构造函数,对类中非静态成员属性简单值拷贝

    如果用户定义拷贝构造函数,c++不会再提供任何默认构造函数

    如果用户定义了普通构造(非拷贝),c++不在提供默认无参构造,但是会提供默认拷贝构造

今天的分享到此结束,喜欢的朋友可以点赞加关注呀!(比心比心🫰)

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的菜鸟ing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值