对C ++来说还不错,我非常了解Java,现在正尝试学习c ++。无论如何,这是我的简单课程。
class PolyGon{
private:
PointArray aArray;
static int numberOfInst;
public:
PolyGon(Point point[], const int newSize) : aArray(point, newSize){}
};
这符合要求。如果我错了,请纠正我,但在初始化列表aArray(point, newSize)
中等效于aArray = new PointArray(point, newSize)
。
因为当我尝试完全相同的代码但将最后一行更改为:
class PolyGon{
private:
PointArray aArray;
static int numberOfInst;
public:
PolyGon(Point point[], const int newSize){aArray = new PointArray(point, newSize)}
};
这给出了例外:
'((PolyGon *)this)-> PolyGon :: aArray =(((PointArray *)operator new(8u)),(-> PointArray :: PointArray((((const Point *))点),newSize),))'|
如果要在此处查看PointArray的构造函数,则为:
PointArray::PointArray(const Point points[], const int newSize)
{
size = newSize;
x = new Point[size];
for(int i = 0; i < size; i++)
{
x[i] = points[i];
}
}
好的,在我提交此文件之前,我找到了一个答案,说如果对象没有默认构造函数,则必须使用初始化器列表对其进行初始化。我现在有三个问题:
我的无参数构造函数如下所示:
PointArray(){size = 0; x = new Point[0];}
为什么是这样?为什么我不能按照我想要的方式去做。
在Java中,aArray
将是对您必须使用创建的单独对象的引用new
。
在C ++中,您必须忘记有关Java对象模型的所有知识。aArray
是包含在中的对象PolyGon
,在创建时会自动PolyGon
创建,并在构造函数体运行之前进行初始化。如果需要提供构造函数参数,则必须在构造函数主体之前的初始化程序列表中提供这些参数;当您进入构造函数主体时,它已经被初始化。
此规则仅适用于构造函数吗?我可以在
PointArray aArray = new PointArray(point, newSize);
别的地方说吗?
new
返回指向动态对象的指针;因此您可以使用它来初始化一个指针(不是对象):
// Careful! This is a recipe for memory leaks.
PointArray * aArray = new PointArray(point, newSize);
但是请记住,如果您使用创建了某些内容new
,则必须delete
在完成后使用销毁它。没有垃圾回收,因此废弃的动态对象会泄漏内存。为避免这种情况,请new
尽可能避免,并在真正需要动态资源时学习如何使用RAII来管理动态资源。
您也可以创建没有new
以下内容的对象:
PointArray aArray(point, newSize);
如果它在代码块内(局部变量;从技术上讲,在块范围内),则它将在程序离开该块时自动销毁。如果它不在任何函数(全局变量;从技术上讲,在名称空间范围内)之内,那么它将持续整个程序的持续时间(或多或少);否则,它将持续整个程序。但全球人士通常被认为是一个坏主意。
我有一个无参数的构造函数。那为什么给我这个错误呢?
使用默认的构造函数。但随后您尝试为其分配一个指针。如果您确实想避免使用初始化程序列表(不应该这样做),则可以通过复制一个临时变量来重新分配它:
PolyGon(Point point[], const int newSize) {
aArray = PointArray(point, newSize); // No new
}
但这可能会降低效率,并要求该类型实现它可能不需要的默认构造函数和复制分配运算符。还有一些类型(例如常量和引用)无法默认初始化或重新分配。列表中的直接初始化适用于所有类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句