【问题标题】:C++ this in constructor? [duplicate]C++ this 在构造函数中? [复制]
【发布时间】:2011-10-18 15:22:18
【问题描述】:

可能重复:
c++ call constructor from constructor

如何在 c++ 中进行“自我”(this)赋值?

Java:

 public Point(Point p) {
        this(p.x, p.y);
    }

在 C++ 中如何做到这一点?

只有this->(constructor of point that takes x, constructor of point that takes y);类似吗?

【问题讨论】:

    标签: java c++ constructor this


    【解决方案1】:

    在 C++0x 中,您可以使用委托构造函数:

    Point(const Point &p) : Point(p.x, p.y) { }
    

    请注意,目前还没有编译器完全支持 C++0x; G++ 中尚未实现此特定功能。

    在旧版本的 C++ 中,您必须委托给私有构造函数:

    private:
        void init(int x, int y) { ... }
    public:
        Point(const Point &p) { init(p.x, p.y); }
        Point(int x, int y)   { init(x, y); }
    

    【讨论】:

    • 虽然在这种情况下可能不值得麻烦。
    • 我没有收到关于 版本的评论。使用 init 和类似函数总是一个设计错误。
    • 虽然要小心——即使使用 --std=c++0x,委托构造函数也没有在 g++ 中实现。我有一段时间没有意识到这一点......
    • @bdonlan -- 我知道委托构造函数,我是说使用 init 类型的函数总是一个糟糕的设计。在 C++0x 之前,人们会编写一个非委托 ctor,例如 Point(const Point& p) : x(p.x), y(p.y) {},即使这意味着更多的输入。
    • @Gene,对于微不足道的构造函数,这是可行的,但如果你在构造函数中做任何过于复杂的事情,将它分解成一个通用函数可能是合理的。那么,这总是取决于情况。
    【解决方案2】:

    如果我理解这段 Java 代码(一个依赖于同一类的另一个构造函数来完成工作的构造函数)的意思:

    public Point(Point p) {
        this(p.x, p.y);
    }
    

    这就是我在C++ 中表达相同的方式:

    class Point {
    
        Point(const Point& p)
           : Point(p.x, p.y) 
        {
            ...
        }
    };
    

    【讨论】:

      【解决方案3】:

      如果您调用同一类的另一个构造函数,它将创建一个新对象。

      如果你想这样做,你应该把构造函数逻辑放在一个 init 方法中,并从所有构造函数中调用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-19
        • 2013-12-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多