文章目录
🥝delete和delete[]的区别?
//代码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;这样就会调用五次析构函数释放资源.
附加知识点:
构造和析构函数依然得把权限设置为public,才可以在类外访问到
🥝重载前置++和后置++时的区别
重载前置++的函数没有参数,后置++有一个参数
operator++(int)//后置++
operator++()//前置++
🥝只通过new来创建对象
#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;
}
🥝一定要通过初始化列表初始化的成员变量
结论:被const修饰但不被static修饰的成员变量,引用
备注:C++有个补丁,可以给成员变量赋一个默认值,上面结论的前提时都没给默认值(缺省值)
错题:
const int b;//const修饰且没被static修饰,必须初始化
float* &c;//引用,必须初始化
static const char*d;//被const和static修饰,不必须初始化
static double* e;//static修饰,不必须初始化
//所以选B
为什么被static修饰的变量不必须初始化,static是属于类的,而不是属于某个对象的,我们什么时候会使用初始化列表?当然是构造对象时,因为此时会调用构造函数,既然static修饰的变量都不属于这个对象自然不需要初始化列表。
简而言之,初始化列表是为了对象的成员变量准备的(这里不牵扯继承的知识)
🥝友元函数参数列表没有this指针
友元函数不是类的成员,所以自然是没有this指针的
🥝友元函数重载运算符
C++友元函数重载运算符至少有一个参数,一目运算符一个参数,二目运算符两个参数
那为什么在类内重载前置++没有参数呢?
原因:成员函数都有个隐式参数this指针,指向当前参数
🥝delete调用析构函数
delete会调用析构函数,因为它直接释放了对象的这块空间,结束了其生命周期(大意了属于是)
原因:成员函数都有个隐式参数this指针,指向当前参数