标准C++(三)

本文详细介绍了C++中的析构函数、构造函数、缺省构造与析构函数的工作原理及使用场景。讨论了类的创建与释放过程,包括成员构造、析构的执行顺序。此外,还讲解了this指针的作用,常函数的概念及其限制,以及拷贝构造和赋值函数的功能和何时需要显式实现。最后提到了深拷贝与浅拷贝的区别,并给出了一个C++类的实例。
摘要由CSDN通过智能技术生成

一、析构函数

什么是析构函数:
与构造函数一样也是一种特殊的成员函数,他会在对象释放的时候自动调用。

函数格式:

~类名(void)
{
    
}

析构函数的任务:
负责释放在构造函数中获取到的所有资源,执行过程:
1、先执行析构函数本身代码
2、调用成员变量的析构函数
3、调用父类的析构函数
注意:析构函数与构造函数的执行顺序相反。

二、缺省构造函数、析构函数

在设计一个类时如果没有显示实现构造和析构函数,编译器会自动生成他们,也就是缺省的构造和析构函数。
但生成的并不是真正语法意义上的函数,而是功能意义上的函数,编译器作为可执行指令的生成者,他有能力直接生成某些功能的二进制指令,不需要借助语言上的函数完成此任务。

什么时候需要显式实现构造函数:
1、有时候成员需要初始化。
2、需要一些参数做一些准备工作。
3、需要在对象使用之前准备资源,如申请一些堆内存。

什么时候需要显式实现析构函数:
缺省的析构函数会释放编译器看得到的所有资源(成员变量、类成员、父类)。
1、保存一些数据。
2、成员变量中有指针,且指向堆内存。

三、类的创建过程与释放过程总结

创建:分配内存 -> 父类构造 -> 成员构造 -> 自己构造
(初始化成员、申请准备内存等)。
父类构造:按照继承表的顺序执行从左到右依次执行父类的构造函数。
成员构造:按照成员的声明顺序从上到下依次执行成员变量的构造函数。

释放:自己析构(保存数据、释放堆内存等)->成员析构 -> 父类析构 -> 释放内存(对象)。
成员析构:按照声明的顺序从下到上依次执行成员函数的析构函数。
父类析构:按照继承表从右到左依次执行父类的析构函数。

作业:
使用C++语法封装NetWork类,调用它实现TCP和UDP回声服务器。

四、this指针

类的成员函数存储在代码段中,类的成员变量存储在每个类对象中,所有类对象共享一份成员函数。

成员函数是如何区分哪个对象在调用它?
当使用类对象调用成员函数编译器会把对象的地址隐式传递给成员函数,每个类成员函数都隐藏着一个参数,这个参数就是this指针。

在成员函数中之所以能直接访问成员变量,就是隐藏着this指针,当在成员函数中调用其他成员函数时也会把this指针传递过去。

this指针时隐藏但也可以显式使用:
1、函数的参数名与成员一致时,可以使用this指针区分成员变量。
2、如果成员函数的返回值是当前对象的地址或引用,就可以使用this指针实现。
3、可以将this指针作为其他函数的参数,把一个类对象传递给其他对象,这样可以实现对象之间的交互。

五、常函数

在函数的参数列表与函数体之间使用const修饰指针,这种函数叫常函数,该const修饰就是this指针。

常函数的特点:不能在函数中修改成员变量的值,普通类对象可以调用常函数,普通成员函数也可以调用常函数,但是常函数只能调用常函数。

注意:常对象只能调用常成员函数,无法调用普通成员函数。

六、拷贝构造

什么是拷贝构造函数:
是一种特殊的构造函数,当使用一个对象初始化另一个新的对象时就会调用拷贝构造函数,它也是类自带的函数之一由编译器自动生成。

拷贝构造格式:

类名(const 类名& that)
{
    
}

什么时候回调用到拷贝构造:
1、类名 对象 = 对象;
2、使用对象作为函数的参数时(不使用引用)。

拷贝构造的任务:
它负责把旧的类对象中的成员拷贝给新的类对象(默认,浅拷贝)。

什么时值需要显式实现拷贝构造:
当类中有成员是指针,且该指针指向一块堆内存,缺省的拷贝构造只会拷贝指针变量的值,这样会导致指向的内存被delete两次从而出现内存崩溃。
此时拷贝构造应该拷贝指针所指向内存(深拷贝),但缺省的拷贝构造无法做到,应该显式实现拷贝构造。

常考面试题:什么是深拷贝与浅拷贝?

七、赋值函数(赋值运算符)

什么是赋值函数:
在C++中是把运算符当做函数处理的,当一个对象给另一个对象赋值时就会自动调用该函数。
赋值函数格式:

operator = (const 类名& that)
{
    
}

什么时候调用:
对象 = 对象;

赋值函数的任务:
与拷贝构造函数一致,负责把一个对象的内存拷贝给另一个对象(浅拷贝)。

什么时候需要显式实现赋值函数:
当需要显式实现拷贝构造时就应该显式实现赋值函数。

编译器会自动生成的成员函数:
构造函数、析构函数、拷贝构造、赋值函数

class String
{
    char* c_str;
public:
	String(const char* str);
    ~String(void);
    String(const String& that);
    String& operator(const String& that);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值