A *pa = new A[10]; //2014迅雷笔试
delete pa;则类A的构造函数和析构函数分别执行了几次()
A、1 1 B、10 10 C、1 10 D、10 1
new 和delete运算符用于动态分配和撤销内存的运算符。
new用法:
1. 开辟单变量地址空间
2)int *a = new int(5) 作用同上,但是同时将整数赋值为5
1)new int; //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个int类型的地址赋值给整型指针a.2. 开辟数组空间,当new分配一个数组时,并未得到一个数组类型的对象,而是得到一个数组元素类型的指针。
1) int * p=new int[get_size()];//方括号中的大小必须是整型,但不必是常量。
2)也可用一个数组类型的类型别名来分配一个数组,这样,new表达式中就不必[].
typedef int arrT[42]//arrT表示42个int的数组类型
int *p=new arrT;//分配一个42个数组,p指向第一个int
例子:
int *p=new int[10]//10个未初始化的int
int *p1=new int[10]()//10个初始化为0的int
delete用法:
1. int *a = new int;
delete a; //释放单个int的空间
2.int *a = new int[5];
delete [] a; //释放int数组空间
要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问.
构造函数
每个类分别定义了他的对象被初始化的方式,类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数称构造函数。无论何时只要类的对象被创建,就会执行构造函数。
1)构造函数没有返回类型。
2)构造函数不能被声明称const的,当我们创建类的一个const对象时,直到构造函数完成初始化过程,对象才能真正取得“常量”属性,因此,构造函数在const对象的构造过程中可以向其写值。
3)只有当类没有声明任何构造函数时,编译器才会自动生成默认构造函数。一旦我们定义了一些其他的构造函数,那么除非再定义一个默认构造函数,否则将没有默认构造函数。
sale_data()=default//定义默认构造函数。
4)构造函数的初始化值列表有时必不可少,例如如果成员是const或者引用,类似的,当成员属于某种类型且该类型没有定义默认构造函数时,也必须讲这个成员初始化。
class ConstRef
{
public:
ConstRef(int ii)
private:
int i;
const int ci;
int &ri;
};
ConstRef::ConstRef(int ii)
{
i=ii; //对
ci=ii;//错,不能个const赋值
ri=i;//错,ri没有初始化;
}
正确的形式应为:
ConstRef::ConstRef(int ii):i(ii),ci(ii),ri(i){}
5)成员初始化顺序。一般初始化的顺序没用什么特别要求,但如果一个成员是用另一个成员来初始化的,那么这两个成员的初始化顺序就很关键。
class X
{
int i;
int j;
public:
X(int val):j(val),i(j){}
}
此例,从构造函数初始值的形式看好像先用val初始化了j,然后用j初始化了i。实际上,i先被初始化,因此这个初始值的效果是试图使用未定义的值j初始化i!