当我们声明一个变量,如:
int i;
或者一个对象,如:
A a;
那么系统就会根据它们的类型自动开辟出一块内存空间用来保存它们的数据。如:
int i; i = 4;
int型变量要占用4个字节的内存的空间,所以系统自动开辟出4个字节的内存空间,然后将4保存在这个4个字节的内存空间中。
但是这里有个问题,就是系统是在哪里开辟的空间?系统会自动在栈中为每个变量开辟内存空间,以保证数值被合理地存放。
由于栈是系统自动分配的,因此速度较快。但其缺点是可存放的空间比较小,只有2MB,假如我们要存放比 较大的数据,显示栈是不行的,那么就得放到堆里,堆是一大堆不连续的内存区域,在系统中由链表将它们串接起来,因此它可存放的空间可以很大,关于它们在执 行效率以及申请方式上的区别。我们还要在数组中详加讨论,这里我们只需要了解它们的两个基本不同点:
1:栈由系统自动分配内存,堆要程序员进行申请。
2:栈中空间比较小,只有2MB,堆得上限是由系统中有效的虚拟内存来定的,因此获得的空间比较大。
使用NEW运算符来建立一个堆,例程如下:
#include
using namespace std;
class A
{
public:
A(){cout<<"构造函数执行完毕!\n";}
};
int _tmain(int argc, _TCHAR* argv[])
{
A *a; //声明一个属于A类的指针a
a = new A; //使用new运算符创建一个堆,它的大小由类A的数据成员的类型和数量来定,
system("pause");
return 0;
}
输出:
构造函数执行完毕!
分析:
我们看到程序运行后输出了"构造函数执行完毕!"的信息,这说明new运算符在堆中创建一个对象时,也会自动调用构造函数来实例化该对象的数据成员。
使用new运算符创建并实例化一个对象,例程如下:
#include
using namespace std;
class A
{
public:
A(int a,int b){i=a;j=b;cout<<"构造函数执行完毕!\n";}
void print(){cout<<i*j<<"\n";}
void set(int a,int b){i=a;j=b;}
private:
int i;
int j;
};
int _tmain(int argc, _TCHAR* argv[])
{
A *a = new A(1,2); //在创建一个对象的同时实例化它的数据成员
a->print(); //输出结果
a->set(7,8); //利用成员函数访问该对象的数据成员并赋值
a->print(); //输出结果
system("pause");
return 0;
}
输出:
构造函数执行完毕!
2
56
分析:
当使用new运算符建立一个类的对象时,比如说类A的对象,new首先分配足以保存该类的一个对象所需要的内存,然后自动调用构造函数来初始化这块内存,再返回这个对象的地址。
对于表达式:
new A;
new调用不带参数的构造函数,而对于表达式:
new A(2,5);
则是new调用了带参数的构造函数
第14行使用new运算符在堆中创建了类A的一个对象,并且在创建的同时调用了带参数的构造函数(第6行)来实例化该对象的数据i和j,将他们的值初始化为1和2,然后将这个堆的内存地址赋给指针a。
第15行通过该地址访问刚创建对象的print成员函数并输出结果。第16行通过该地址利用该对象的成员函数访问该对象的数据成员并赋值,第17行再次输出结果。
由于a是个指针,因此第15-17行用a来访问函数时用到了指向成员运算符->.
转载自:http://blog.sina.com.cn/s/blog_7dd2b7040101aefv.html