C ++中的初始化程序列表和类初始化。我有无参数构造函数,但仍必须使用初始化列表?

用户名

对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];
    }
}

好的,在我提交此文件之前,我找到了一个答案,说如果对象没有默认构造函数,则必须使用初始化器列表对其进行初始化。我现在有三个问题:

  1. 为什么是这样?为什么我不能按照我想要的方式去做。
  2. 此规则仅适用于构造函数吗?我可以说“ PointArray aArray = new PointArray(point,newSize);” 别的地方?
  3. 我有一个无参数的构造函数。那为什么给我这个错误呢?

我的无参数构造函数如下所示:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++初始化构造函数初始化器列表中的模板数组

来自分类Dev

C ++初始化字段直接与默认构造函数中的初始化列表

来自分类Dev

C ++ 11统一初始化:初始化列表和多参数构造函数之间的歧义?

来自分类Dev

C ++在初始化列表中的基类初始化之前调用函数

来自分类Dev

C ++构造函数:在初始化列表之前初始化局部变量

来自分类Dev

C ++ 11使可变参数构造函数了解初始化列表的初始化列表

来自分类Dev

C ++初始化程序列表的元素比结构少

来自分类Dev

C ++入门说我们可以对“ = default”构造函数使用初始化列表

来自分类Dev

C ++初始化程序列表功能:调用函数而不初始化成员吗?

来自分类Dev

C ++标准中是否有任何解决初始化程序列表构造函数不一致的计划?

来自分类Dev

C ++:构造函数按初始化列表的顺序

来自分类Dev

如何使用std :: array构造函数参数C ++列表初始化const std :: array成员

来自分类Dev

C ++中初始化程序列表的顺序

来自分类Dev

为什么C ++要求我在初始化列表中重复基类的模板参数?

来自分类Dev

C ++:具有初始化列表的默认构造函数

来自分类Dev

C ++初始化程序列表成员仍在调用默认构造函数?

来自分类Dev

具有参数包或初始化程序列表的c ++ 20视图

来自分类Dev

C ++初始化程序列表重载消除歧义

来自分类Dev

C ++:使用RAII解决构造函数初始化程序列表依赖项

来自分类Dev

为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

来自分类Dev

C ++使用其他参数获取构造函数的初始化程序列表

来自分类Dev

使用初始化列表时检查传递给构造函数的参数-C ++

来自分类Dev

具有复杂参数的初始化列表C ++

来自分类Dev

在类构造函数中初始化const向量(C ++)

来自分类Dev

c ++ 11初始化程序列表作为数组

来自分类Dev

在C ++中的类构造函数中进行列表初始化

来自分类Dev

C ++中的初始化程序列表性能?

来自分类Dev

使用初始化列表的 C++ 变量参数

来自分类Dev

C 中的初始化列表和序列点

Related 相关文章

  1. 1

    C ++初始化构造函数初始化器列表中的模板数组

  2. 2

    C ++初始化字段直接与默认构造函数中的初始化列表

  3. 3

    C ++ 11统一初始化:初始化列表和多参数构造函数之间的歧义?

  4. 4

    C ++在初始化列表中的基类初始化之前调用函数

  5. 5

    C ++构造函数:在初始化列表之前初始化局部变量

  6. 6

    C ++ 11使可变参数构造函数了解初始化列表的初始化列表

  7. 7

    C ++初始化程序列表的元素比结构少

  8. 8

    C ++入门说我们可以对“ = default”构造函数使用初始化列表

  9. 9

    C ++初始化程序列表功能:调用函数而不初始化成员吗?

  10. 10

    C ++标准中是否有任何解决初始化程序列表构造函数不一致的计划?

  11. 11

    C ++:构造函数按初始化列表的顺序

  12. 12

    如何使用std :: array构造函数参数C ++列表初始化const std :: array成员

  13. 13

    C ++中初始化程序列表的顺序

  14. 14

    为什么C ++要求我在初始化列表中重复基类的模板参数?

  15. 15

    C ++:具有初始化列表的默认构造函数

  16. 16

    C ++初始化程序列表成员仍在调用默认构造函数?

  17. 17

    具有参数包或初始化程序列表的c ++ 20视图

  18. 18

    C ++初始化程序列表重载消除歧义

  19. 19

    C ++:使用RAII解决构造函数初始化程序列表依赖项

  20. 20

    为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

  21. 21

    C ++使用其他参数获取构造函数的初始化程序列表

  22. 22

    使用初始化列表时检查传递给构造函数的参数-C ++

  23. 23

    具有复杂参数的初始化列表C ++

  24. 24

    在类构造函数中初始化const向量(C ++)

  25. 25

    c ++ 11初始化程序列表作为数组

  26. 26

    在C ++中的类构造函数中进行列表初始化

  27. 27

    C ++中的初始化程序列表性能?

  28. 28

    使用初始化列表的 C++ 变量参数

  29. 29

    C 中的初始化列表和序列点

热门标签

归档