C++复习02(this 指针、构造、拷贝构造、运算符重载、析构、const、static、友元、内存管理)

本文详细讲解了C++中的this指针,包括其概念、特性、传递方式以及可能为空的情况。接着讨论了类的编译过程,特别是成员函数的改写。此外,文章还阐述了构造函数、拷贝构造函数、赋值运算符重载、析构函数的重要性及其默认行为,强调了const和static关键字的使用,以及友元和动态内存管理的概念。
摘要由CSDN通过智能技术生成

this指针

1.this概念:类非静态成员函数的第一个隐藏的函数,该参数使用指向调用当前函数的对象
2.this指针特性
a.this指针类型 T*const

  • 普通类型成员函数:T* const
    可以修改对象的内容
    可以调用普通和const类型的成员函数
  • const类型成员函数:const T* const
    this指向不能修改并且指向对象中的内容也不能修改
    只能调用const类型的成员函数

b.this是非静态成员函数的第一个隐藏函数(用户在编写函数时不用给出this的参数,该参数是由编译器自己维护,调用该函数也不需要手动传递,this指针的传参可以有编译器自动完成)

c.this指针只存在于正在运行的成员函数中,this指针不会存在于对象中

d.静态成员函数没有this指针,不是和对象相关的函数,是类的属性

e.this指针的传递:一般情况ecx寄存器(this_call:调用约定)也可能通过参数压栈的方式进行传递:push 对象地址 比如:类中如果包含不定参数的成员函数

有哪些调用约定?这里不具体介绍,后面在C++函数的调用规则中再介绍。
C++函数的调用规则

3.this指针是否可以为空
a.如果成员函数是通过对象的方式进行调用,this指针一定不会是空

T t;
t.TestFun();

b.如果成员函数是通过类类型的指针方式进行调用,this指针可能会为空

T t; 
T* pt=&t; 
pt->TestFun(); 
pt=nullptr; 
pt->TestFun();

其中pt=nullptr; pt->TestFun(); 代码可以通过编译,但是在运行期间可能会出现错误。如果在成员函数中没有访问非静态成员变量,一定不会崩溃,如果访问任何非静态成员变量,代码一定会崩溃

4.this指针位置:

类的编译过程:

1.识别类名
2.识别类中的成员
3.识别类中的成员函数,并对成员函数进行改写
a.给非静态的成员函数增加隐藏的this指针参数
b.对成员函数中每个访问非静态成员变量前增加this
一道面试题:
该代码是否有问题?

class A
{
public:
~A()
{
delete this;
}
};

可以从编译、运行两个方面来看。
编译:没有任何语法问题,编译通过
运行时:代码崩溃。无限递归,造成栈溢出而导致代码崩溃
delete:
1.调用析构函数,清理对象中的资源
2.释放指针所指向的堆空间
在这里插入图片描述

类中6个默认的成员函数:

1.什么是默认的成员函数:如果用户没有显示定义该成员函数,编译器将会自动生成一个
2.默认的成员函数都有哪些?
构造函数、析构函数、拷贝构造函数、赋值运算符重载函数、取地址操作符重载、const修饰的取地址操作符重载。

构造函数

a.概念:
是一个特殊的成员函数,函数名必须与类名相同,在创建对象期间由编译器自动来进行调用,已完成对象的初始化工作,并且在对象的整个生命周期内只调用一次。因此初始化只需要初始化一次

b.特性

  • 函数名必须与类名相同
  • 没有返回值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值