gpt4 book ai didi

c++ - 在初始化对象之前在对象上运行的方法?

转载 作者:太空宇宙 更新时间:2023-11-03 10:37:22 25 4
gpt4 key购买 nike

#include <iostream>
using namespace std;

class Foo
{

public:

Foo(): initialised(0)
{
cout << "Foo() gets called AFTER test() ?!" << endl;
};

Foo test()
{
cout << "initialised= " << initialised << " ?! - ";
cout << "but I expect it to be 0 from the 'initialised(0)' initialiser on Foo()" << endl;
cout << "this method test() is clearly working on an uninitialised object ?!" << endl;
return Foo();
}

~Foo()
{};

private:

int initialised;

};


int main()
{

//SURE this is bad coding but it compiles and runs
//I want my class to DETECT and THROW an error to prevent this type of coding
//in other words how to catch it at run time and throw "not initialised" or something

Foo foo=foo.test();

}

最佳答案

是的,它正在调用尚未构造的对象上的函数,这是未定义的行为。您无法可靠地检测到它。我认为您也不应该尝试检测它。与例如在已删除的对象上调用函数相比,这不是偶然发生的事情。试图捕获所有可能的错误几乎是不可能的。声明的名称在其初始化程序中已经可见,用于其他有用的目的。考虑一下:

Type *t = (Type*)malloc(sizeof(*t)); 

这是 C 编程中的常见习语,在 C++ 中仍然有效。

就我个人而言,我喜欢this story由 Herb Sutter 关于空引用(同样无效)。要点是,不要试图避免语言明确禁止的情况,尤其是在一般情况下无法可靠诊断的情况。随着时间的推移,您将获得虚假的安全保障,这将变得非常危险。相反,以一种减少犯错机会的方式(避免原始指针,...)训练您对语言和设计界面的理解。

在 C++ 和 C 中,许多情况并未明确禁止,而是未定义。部分原因是有些事情很难高效诊断,部分原因是未定义的行为允许实现设计替代行为,而不是完全忽略它——现有编译器经常使用这种行为。

例如,在上述情况下,任何实现都可以自由抛出异常。还有其他情况同样是未定义的行为,这些情况更难以有效地诊断实现:在构造之前访问不同翻译单元中的对象就是这样一个例子 - 这被称为静态初始化顺序惨败

关于c++ - 在初始化对象之前在对象上运行的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/723344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com