c++ - 使用指针进行类实例化
问题描述
有人可以阐明下一段代码是如何创建对象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;
}
解决方案
不,我们无法阐明它是如何工作的。 v
从未被初始化,所以试图从它(不)指向的对象复制是未定义的行为。试图推理未定义的行为是徒劳的,除了调试目的。最可能的行为是段错误,或者*b
是一些随机内存的副本。
正如彼得在他的评论中指出的那样,编译器不需要诊断未定义行为的实例。在这种情况下,如果您提高警告级别,我希望大多数编译器会发出警告(-Wall -werror 是很好的标志)。
推荐阅读
- python-3.x - sqlite-变量表名不适用于删除或插入命令
- javascript - 如何在没有弹出窗口的情况下使用 Google Identity API 和登录?
- android - 如何解决由于权限相关问题而导致谷歌播放控制台不允许我上传新版本的签名 apk 的问题
- c - 如何使用 nrf51822 模块在一定时间间隔后关闭 LED
- android - PayUMoney - Android:收到一些错误响应
- javascript - 根据选定的 id 排列对象数组
- swift - 如何为任何 NSView 中的文本禁用字体抗锯齿(又名字体平滑)?
- express - 如何在从填充文档中选择有限值时使用 mongoose-paginate 填充
- python - Python for 从索引 1 循环或忽略第一个
- c# - c# - 缺少 Microsoft.VisualC.CppCodeProvider