首页 > 解决方案 > 使用指针进行类实例化

问题描述

有人可以阐明下一段代码是如何创建对象b的吗?看起来它正在使用默认的复制构造函数?我看不出它是如何处理一个从未实例化的对象 object v的。

#include <iostream>
using namespace std;
class A {
public:
    A(float v) { A::v = v; cout << "hola" << endl;}
    float v;
    float set(float v) {
        A::v = v;
        return v;
    }
    float get(float v) {
        return A::v;
    }
};
int main() {
    A c(2.0);
    A *v;
    A *a = new A(1.0), *b = new A(*v);
    cout << a->get(b->set(c.v));
    return 0;
}

标签: c++classoopobject

解决方案


不,我们无法阐明它是如何工作的。 v从未被初始化,所以试图从它(不)指向的对象复制是未定义的行为。试图推理未定义的行为是徒劳的,除了调试目的。最可能的行为是段错误,或者*b是一些随机内存的副本。

正如彼得在他的评论中指出的那样,编译器不需要诊断未定义行为的实例。在这种情况下,如果您提高警告级别,我希望大多数编译器会发出警告(-Wall -werror 是很好的标志)。


推荐阅读