本来今天吧,想写一个proxy class的范例,写着写着出了个问题,见如下代码
const int _cap = 10; Array1D* _elemArray = new Array1D[_cap];
同时我为Array1D这个类写了一个构造函数来顶替编译器自动生成的
Array1D(int inx) { _elemNum = new T[inx]; }
随后报错,提示没有合适的默认构造函数,但是显然,我这里是提供了一个构造函数的,那么问题就出在现有的构造函数不能应对上面的new语句
联系vector的构造:vector<int>* vec = new vector<int>[20](25); 20是一个vector数组的长度,25是数组中每个vector的长度,则我们可以知道,这里面应该传递了有三种信息:
1.对new分配内存来说,申请内存的对象类型是个vector
2.一共有20个这样的对象
3.25作为这些对象的构造函数的第一个参数传入
那么根据new Array1D[_cap]来看,_cap并不是作为一个参数传递给了Array1D这个类的构造函数,而是作为new函数的一个参数分配内存所用
也就是说,上述的代码可以这样看new(Array1D,_cap,③);
其中的③应该是传递给构造函数的参数
则显然,上面我提供的构造函数必须要有一个参数存在(因为没有使用默认值,事实上这个问题如果给inx一个默认值就不需要提供一个新的无参数构造函数了,不过分离这个问题出来对理解C++的构造函数更有帮助,我觉得使用默认值有点绕开这个问题的意思(逃)),但最上面的代码并没有提供这一参数,故此处实际上是需要一个没有参数的构造函数添加进代码(在此代码中实际上也没需要,空函数体也没问题),之后便通过了编译。
原文地址:https://www.cnblogs.com/HotPants/p/11421065.html
时间: 2024-10-10 04:58:09