gpt4 book ai didi

c++ - 必须在构造函数初始化列表中初始化引用类型吗?

转载 作者:可可西里 更新时间:2023-11-01 17:16:08 29 4
gpt4 key购买 nike

作为 self 练习,我写了这么简单的代码:

#include <iostream>

int gIndex = 3;

template <class T> class Array
{
public:
explicit Array(int size);
T& operator[](int i) { return m_data[i]; }
T operator[](int i) const { return m_data[i]; }
T getAnchorPoint() const { return m_data[m_anchor]; }
private:
T* m_data;
int m_size;
int& m_anchor;
};

template <class T> Array<T>::Array(int size) : m_size(size), m_data(new T[size])
{
memset(m_data, 0, size*sizeof(T));
m_anchor = gIndex;
}

int main()
{
Array<double> a(10);
return 0;
}

我遇到了一个编译错误,上面写着:

error C2758: 'Array<T>::m_anchor' : must be initialized in constructor base/member initializer list

从来没有发生过,是什么让我问这个问题:

必须在构造函数初始化列表中初始化任何类成员引用类型吗?

如果是,为什么?这在某种程度上与引用类型永远无法重新分配的事实有关吗?

在构造函数初始化列表中是否有更多类型必须初始化?

最佳答案

Does any class-member reference type must be initialized in the constructor initialization list?

是的。

If so, why? Is that related somehow to the fact the a reference type can never be reassigned?

这是部分原因。另一部分是因为引用必须被初始化,而且它没有默认构造函数。

Are there more types that must be initialized in constructor initialization list?

任何没有赋值运算符(无论是复制还是移动)或默认构造函数的类型。这显然包括(但不限于)const 成员,因为它们一旦构造就无法修改。


根据经验,你应该(几乎)总是喜欢在构造函数的初始化列表中初始化你的成员:为什么要浪费循环首先默认构造一个对象然后只分配给它(如果这甚至可能),当您可以首先正确构建它吗?

关于c++ - 必须在构造函数初始化列表中初始化引用类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17992121/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com