C++错题记录

🥝delete和delete[]的区别?

image-20220303225302754

//代码demo
#include<iostream>
using namespace std;
class ClassA
{
public:
	ClassA()
	{
		cout << "ClassA()" << endl;
	}
	~ClassA()
	{
		cout << "~ClassA()" << endl;
	}
};
int main()
{
	ClassA* pclassA = new ClassA[5];
	cout << sizeof(ClassA) << endl;
	delete pclassA;
	/*delete[] pclassA;*/
	return 0;
}

这段代码其实是由问题的,new的是一个数组,自然得用delete[]配对

题目现在就是问delete,而不是delete[]

题目就转变成了在需要使用delete[]的时候使用了delete的后果

先说结论:vs2013检查内存,程序崩溃

原因:delete可以理解为对free的封装,delete pclassA可以释放new出来的空间,但是只会调用一次析构函数(pclassA[0]调用的),又因为在类里面开辟的空间需要通过析构函数释放,这里new了五个对象,但是只有一个对象的资源被释放,其余四个对象的资源未被释放,vs编译器检查到了这块错误,程序崩溃.

正确使用:delete[] pclassA;这样就会调用五次析构函数释放资源.

image-20220303231542943

附加知识点:

构造和析构函数依然得把权限设置为public,才可以在类外访问到

image-20220303225602409

🥝重载前置++和后置++时的区别

image-20220303232003227

重载前置++的函数没有参数,后置++有一个参数

operator++(int)//后置++
operator++()//前置++

🥝只通过new来创建对象

image-20220303232726319

#include<iostream>
using namespace std;
class A
{
public:
	A()
	{
		cout << "A()" << endl;
	}
private:
	~A()
	{
		cout << "~A()" << endl;
	}
};
int main()
{
	A* a = new A;
	//A a;
	return 0;
}

image-20220303233011163

🥝一定要通过初始化列表初始化的成员变量

结论:被const修饰但不被static修饰的成员变量,引用

备注:C++有个补丁,可以给成员变量赋一个默认值,上面结论的前提时都没给默认值(缺省值)

image-20220303234209156

错题:

image-20220303234356886

const int b;//const修饰且没被static修饰,必须初始化
float* &c;//引用,必须初始化
static const char*d;//被const和static修饰,不必须初始化
static double* e;//static修饰,不必须初始化
//所以选B    

为什么被static修饰的变量不必须初始化,static是属于类的,而不是属于某个对象的,我们什么时候会使用初始化列表?当然是构造对象时,因为此时会调用构造函数,既然static修饰的变量都不属于这个对象自然不需要初始化列表。

简而言之,初始化列表是为了对象的成员变量准备的(这里不牵扯继承的知识)

🥝友元函数参数列表没有this指针

image-20220304000939385

友元函数不是类的成员,所以自然是没有this指针的

🥝友元函数重载运算符

image-20220304002750698

C++友元函数重载运算符至少有一个参数,一目运算符一个参数,二目运算符两个参数

那为什么在类内重载前置++没有参数呢?

原因:成员函数都有个隐式参数this指针,指向当前参数

🥝delete调用析构函数

image-20220304003058602

delete会调用析构函数,因为它直接释放了对象的这块空间,结束了其生命周期(大意了属于是)

原因:成员函数都有个隐式参数this指针,指向当前参数

  • 18
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

喜欢乙醇的四氯化碳

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

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

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

打赏作者

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

抵扣说明:

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

余额充值