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

EF核心3.1:在使用紧急加载加载相关实体时,我应该初始化列表导航属性吗?

분류에서Dev

初始化总是应该使用相同的内存块吗?

분류에서Dev

从Android中的片段将PopupWindow的实例初始化为一个类

분류에서Dev

C#Json反序列化失败

분류에서Dev

子类的C#XML序列化-从根节点删除xmlns:p1和p1:type属性

분류에서Dev

引用C ++中的C结构

분류에서Dev

在C ++中跨类使用结构

분류에서Dev

自動によるC ++ 11の初期化

분류에서Dev

Понимание вложенного массива c ++ в контексте сканирования изображений

분류에서Dev

C#-将对象列表序列化为文件的最佳方法是什么?

분류에서Dev

C#UML类图

분류에서Dev

为什么不构造内部类?C ++

분류에서Dev

C#的方法相同,但参数不同:带有ref和不带

분류에서Dev

每秒从C程序记录3000个事件

분류에서Dev

C#XAML WPF在UserControl上渲染之前使用参数

분류에서Dev

远程方法调用Phonegap和C#

분류에서Dev

如何在Microsoft Visual Studio Express中具有多个用于Web的C#类

분류에서Dev

C中奇怪的运行时错误?

분류에서Dev

C ++中的对象创建和成员声明

분류에서Dev

MKL文件在MEX文件和独立C ++中的行为不同

분류에서Dev

C / C ++`! a` 대`a == 0`

분류에서Dev

C library in C++

분류에서Dev

C ++で正規表現のトークン化を使用して繰り返されるパターンをキャプチャする方法

분류에서Dev

使用GSON自定义反序列化枚举

분류에서Dev

使用jdbc-message-channel的序列化错误

분류에서Dev

setwaitedtimer函数不会在c中调用回调函数

분류에서Dev

C#のリストを持つオブジェクトへのXMLの逆シリアル化

Related 관련 기사

  1. 1

    C结构初始化(整数和整数值的数组)

  2. 2

    为什么在使用指针(C ++)时出现未初始化的堆内存错误?

  3. 3

    EF核心3.1:在使用紧急加载加载相关实体时,我应该初始化列表导航属性吗?

  4. 4

    初始化总是应该使用相同的内存块吗?

  5. 5

    从Android中的片段将PopupWindow的实例初始化为一个类

  6. 6

    C#Json反序列化失败

  7. 7

    子类的C#XML序列化-从根节点删除xmlns:p1和p1:type属性

  8. 8

    引用C ++中的C结构

  9. 9

    在C ++中跨类使用结构

  10. 10

    自動によるC ++ 11の初期化

  11. 11

    Понимание вложенного массива c ++ в контексте сканирования изображений

  12. 12

    C#-将对象列表序列化为文件的最佳方法是什么?

  13. 13

    C#UML类图

  14. 14

    为什么不构造内部类?C ++

  15. 15

    C#的方法相同,但参数不同:带有ref和不带

  16. 16

    每秒从C程序记录3000个事件

  17. 17

    C#XAML WPF在UserControl上渲染之前使用参数

  18. 18

    远程方法调用Phonegap和C#

  19. 19

    如何在Microsoft Visual Studio Express中具有多个用于Web的C#类

  20. 20

    C中奇怪的运行时错误?

  21. 21

    C ++中的对象创建和成员声明

  22. 22

    MKL文件在MEX文件和独立C ++中的行为不同

  23. 23

    C / C ++`! a` 대`a == 0`

  24. 24

    C library in C++

  25. 25

    C ++で正規表現のトークン化を使用して繰り返されるパターンをキャプチャする方法

  26. 26

    使用GSON自定义反序列化枚举

  27. 27

    使用jdbc-message-channel的序列化错误

  28. 28

    setwaitedtimer函数不会在c中调用回调函数

  29. 29

    C#のリストを持つオブジェクトへのXMLの逆シリアル化

뜨겁다태그

보관