new运算符以及构造函数与析构函数

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!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值