C++错题记录

文章目录

    • delete和delete[]的区别?
    • 重载前置++和后置++时的区别
    • 只通过new来创建对象
    • 一定要通过初始化列表初始化的成员变量
    • 友元函数参数列表没有this指针
    • 友元函数重载运算符
    • delete调用析构函数

delete和delete[]的区别?

C++错题记录_第1张图片

//代码demo
#include
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;这样就会调用五次析构函数释放资源.

C++错题记录_第2张图片

附加知识点:

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

C++错题记录_第3张图片

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

C++错题记录_第4张图片

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

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

只通过new来创建对象

C++错题记录_第5张图片

#include
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;
}

C++错题记录_第6张图片

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

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

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

C++错题记录_第7张图片

错题:

C++错题记录_第8张图片

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

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

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

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

C++错题记录_第9张图片

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

友元函数重载运算符

C++错题记录_第10张图片

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

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

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

delete调用析构函数

C++错题记录_第11张图片

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

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

你可能感兴趣的:(C++学习笔记,c++,开发语言,后端)