如何用new运算符在堆区开辟一个对象数组的空间呢,
#include<iostream>using namespace std;class A{public: A(int a,int b):i(a),j(b){} void print() { cout<<i<<" "<<j<<endl; }private: int i; int j;};A *pArr = new A[NUM];
[解决办法]
必须给 A 一个默认构造函数才行.
[解决办法]
无参数或者默认参数
[解决办法]
要直接使用数组必须要有无参的构造函数.
或者可以这样不直接创建数组:
A* pA = (A*)malloc(sizeof(A) * COUNT);for(int i = 0; i < COUNT; ++i){ new (&pA[i]) A(10, 20);}
[解决办法]
比较诡异的用法(测试居然可以正常工作):
A *pAx=(A *)new BYTE[sizeof(A)*100];
......
delete [](BYTE*)pAx;
[解决办法]
首先回答你的第一个问题:
new出的对象默认都是存在堆中的,所以……尽管去new。(如果有引用则另说)
class A{public: A(int a,int b):i(a),j(b){} void print() { _tprintf_s(_T("[%d %d]"), i,j); } void Set(int a,int b){i=a; j=b;}private: int i; int j;}; A *pAx=(A *)new BYTE[sizeof(A)*100]; pAx->print();//没初始化,输出乱数字,但执行是正常的 pAx[5].Set(33,55);//执行正常 pAx[5].print();//这个执行与效果一切正常... delete [](BYTE*)pAx;
[解决办法]
class A{public: A(int a,int b):i(a),j(b){} void print() { _tprintf_s(_T("[%d %d]"), i,j); } void Set(int a,int b){i=a; j=b;}private: int i; int j;};int _tmain(int argc, _TCHAR* argv[]){ A *pAx=(A *)new BYTE[sizeof(A)*100]; pAx->print(); pAx[5].Set(33,55); pAx[5].print(); delete [](BYTE*)pAx;return 0;}