目录
- ClassA *pclassa=new ClassA[5];
- delete pclassa;
C++语言中,类ClassA的构造函数和析构函数的执行次数分别为()
A 5,1
B 1,1
C 5,5
D 1,5
1.malloc/calloc/readlloc-->free
2.new/delete
3.new[]/delete[]
一定要匹配使用,否则程序可能会产生内存泄漏,程序可能会崩溃
如果是
new T:
1.调用operator new(size)申请空间
内部其实是用malloc循环申请
2.调用T的构造函数对申请的空间进行初始化
delete p:
1.调用析构函数释放p指向对象中的资源。
2.调用operator delete释放p所指向的空间
内部是调用free的
所以这个new和delete其实是将这个malloc和free封装在里面了
注意:new只能申请单个元素的空间,delelte只能释放单个元素的空间
new T[N]
1.调用operator new[](size)申请空间
内部会调用operator new(size)
2.调用N次T的构造函数
delete[] p
1.调用N次析构函数释放p指向的N个对象
2.调用operator delete[](p)
内部调用的就是 operator delete(p)
pclass从堆上new了5个对象,存放在一段连续的空间,也就是调用了5次构造函数
然后delete pclass释放其实是有问题的,真正的释放其实是应该是delete[] pclass,释放这五个对象,这个delete pclass仅仅是释放一次,也就是仅仅是会将这五个对象其中的一个释放掉。也就是仅仅调用一次析构函数。
但是程序运行期间可能会发生崩溃,如果有这个选项,就选择可能会崩溃这个选项
A
在重载一个运算符为成员函数时,其参数表中没有任何参数,这说明该运算符是 ( )。
A 无操作数的运算符
B 二元运算符
C 前缀一元运算符
D 后缀一元运算符
首先,它一定是一元运算符,因为该运算符只需要一个参数。比方说++,--
每个非静态的成员函数没有任何参数,但是它还有一个隐藏的this指针。
前置++的重载(++1)
Date& operator++()
后置++的重载(1++)
Date operator++(int)
为了让这两个函数形成函数重载,函数名一样,参数列表不同,所以我们的后置++在参数列表增加了一个int。
因为我们这里没有任何参数,所以是前置++
C
在C++中,为了让某个类只能通过new来创建(即如果直接创建对象,编译器将报错),应该()
A 将构造函数设为私有
B 将析构函数设为私有
C 将构造函数和析构函数均设为私有
D 没有办法能做到
A类:假设A类的构造函数是私有的
在类外:A* pa=new A();那就无法进行创建了。
因为new原理:1.申请空间 2.调用构造函数对申请的空间进行初始化(私有的话就没办法进行调用构造函数进行初始化了)
析构函数设置为私有的话,创建对象还是可以创建的,没有任何问题。在创建完成之后,如果想要对该对象进行销毁这个delete pa;就不可以了。
delete:1.调用A类的析构函数(因为析构函数为私有,所以这一步无法完成了) 2.释放空间。
但是我们可以给A类增加一个共有的方法,来释放空间
void Release(A*&p)
{
delete p;
}
B
下面有关c++静态数据成员,说法正确的是()
A 不能在类内初始化
B 不能被类的对象调用
C 不能受private修饰符的作用
D 可以直接用类名调用
静态成员变量:所有的对象共享的,并不属于具体的某个对象--在类中声明,然后再类外单独进行定义,不能在构造函数的初始化列表的位置初始化--在类外访问静态成员变量时:对象。静态成员变量||类名::静态成员变量
A:如果是const类型的静态成员变量,比方说const static int a=10是可以在类内进行初始化的。但如果是static int b=20就不可以了!!
(带有类内初始化静态类型的成员变量,必须为常量!)
不是const类型就在类外进行初始化int A::b=20;
C:都是会受到访问限定符的限制的
D
下列的模板声明中,其中几个是正确的()
1)template
2)template
3)template
4)template
5)template
6)template
7)template
8)
A 2
B 3
C 4
D 5
下面两种都是可以的
template
template
如果有多个,每一个前面都需要加上class。
template
class和typename可以混着使用
所以正确的是4,6,7,一共三个
B