具有引用数据成员的类的默认构造函数?

Posted

技术标签:

【中文标题】具有引用数据成员的类的默认构造函数?【英文标题】:Default constructor for a class with a reference data member? 【发布时间】:2014-04-05 00:39:42 【问题描述】:

我有一个类MyClass,我需要在默认构造函数中创建std::vectorstd::array。然而,这个类有一个数据成员,它是一个引用(类型为Something),它也需要在构造函数中初始化,我不能在默认构造函数中这样做。

我应该如何解决这个问题?

class MyClass
public:
    MyClass(); //Cannot instantiate s??
    MyClass(Something& s);
    Something& s;


MyClass array[10];   // MyClass needs a default constructor but a default 
                     // constructor won't be able to initialize s

【问题讨论】:

你能给我们一个简单的代码例子来说明这个问题吗? 但仅从描述来看,我想说这是一个经典案例,s 应该是 Something* 而不是 Something&... 【参考方案1】:

具有引用成员的类需要在其构造函数中设置引用。在大多数情况下,这意味着该类不能有默认构造函数。解决问题的最好方法是使用指针而不是引用:

class MyClass
public:
    MyClass() : s_(0) 
    MyClass(Something* s) : s_(s) 
    Something* s_;

【讨论】:

从技术上讲,它可以有一个默认构造函数(例如,如果它在 s_ 中存储对全局的引用)。问题是您必须将引用“指向”Something 实例。【参考方案2】:

正如我在上面评论的那样,仅通过描述,我会说这是一个经典案例,s 应该是 Something* 而不是 Something&...

OTOH,这很完美,所以你不需要需要默认构造函数如果你只是初始化你的数组的每个元素

struct Something  ;

struct MyClass 
  MyClass(Something& ss) : sss 
  Something& s;
;

int main() 
  Something a, b, c, d;
  Something v[10] =  a, b, c, d, a, b, c, d, a, b ;
  return 0;

【讨论】:

那是因为您使用了列表初始化程序,而我没有要添加到数组中的元素以开始:) 好吧,你总是可以做MyClass() : ssx ; static Something sx;【参考方案3】:

您也可以这样做:

class MyClass
public:
    MyClass() : s_(0) 
    MyClass(Something& s) : s_(&s) 
    Something* s_;

【讨论】:

以上是关于具有引用数据成员的类的默认构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

在构造函数代码之前禁用默认类成员初始化

C++ 类的复制控制

C++ 中类的默认成员函数的问题(构造函数、析构函数、运算符 =、复制构造函数)(默认 ctor、dtor、复制 ctor)

详解c++中类的六个默认的成员函数

详解c++中类的六个默认的成员函数

详解c++中类的六个默认的成员函数