【问题标题】:Is it valid to create an object inside the constructor of class?在类的构造函数中创建对象是否有效?
【发布时间】:2015-11-10 16:39:32
【问题描述】:

考虑以下程序:

#include <iostream>
struct T
{
    public:
        T() : b(6)
        {
            T t=*this;  // copy constructor
            std::cout<<t;
        }
        int b;
        friend std::ostream& operator<<(std::ostream&,const T& t);
}t;
std::ostream& operator<<(std::ostream& o,const T& t)
{
    o<<t.b<<'\n';
    return o;
}
int main() { }

上面的程序对我来说确实很奇怪。在构造函数中创建类的对象可以吗?这段代码的行为是否明确定义?

【问题讨论】:

  • 虽然技术上有效,但这是个坏主意。请阅读:Should you use the this pointer in the constructor?
  • 在构造函数完成之前,不会认为对象已被构造。我不太相信*this 的这种用法是正确的
  • @M.M: 为什么ideone.com/BsIm3G 这个程序会导致运行时错误。当我在 g++ 4.8.1 上的本地计算机上编译并运行它时,我在运行时收到错误消息 test.exe 已停止工作。为什么?是什么原因?
  • @PravasiMeet 该程序导致递归,因为T t; 出现在T 的默认构造函数中
  • @M.M:哦,我没有注意到递归。谢谢。

标签: c++ object constructor


【解决方案1】:

是的,它定义明确。它将使用一个复制构造函数,并且当构造函数的主体结束时对象被破坏。

但是,我觉得这段代码很奇怪,而且我很难找到它的正确用途。

【讨论】:

  • 可能值得一提的是关于从构造函数调用成员函数的陷阱,特别是如果它们是虚拟的,因为对象的具体类型是当前运行构造函数的类型,而不是叶类型。
  • @PravasiMeet 这将是在 Stack Overflow 上提出的问题。
【解决方案2】:

只要你不会无意中递归调用同一个构造函数就可以了!我见过很多学生程序就是这样做的,通常是在尝试实现链表时。

【讨论】:

  • 在不同的对象上重新输入同一个构造函数不一定是个问题。没有终止的递归是。
  • 确实如此,只要有基本情况。看到很多学生代码,其中构造函数的第一行无条件地创建具有相同构造函数的同一类的实例。
猜你喜欢
  • 1970-01-01
  • 2017-09-05
  • 2013-06-20
  • 1970-01-01
  • 2013-10-14
  • 2020-09-09
  • 2020-04-02
  • 2020-07-05
  • 1970-01-01
相关资源
最近更新 更多