Bad_area()
是对类的默认构造函数的显式调用Bad_area
。
也就是说,throw Bad_area()
直接返回(抛出)类的匿名实例Bad_area
。
当您直接返回实例时,与在 Java 或 C# 等 OO 语言中相同。例如:
void foo() throws MyException
{
if( error ) throw new MyException();
}
请注意,在 C++ 中很少使用对构造函数的显式调用,因为实例的生命周期基于 RAII。
只有少数情况下显式调用是一个好主意,其中大多数就像您的示例,return 语句。例如,一个point_2d
代数方法很容易内联的类:
struct point_2d
{
float x;
float y;
point_2d(float _x = 0.0f , float _y = 0.0f) : x( _x ) , y( _y ) {}
//Easy inlineable addition:
point_2d operator+(const point_2d& lhs , const point_2d& rhs)
{
return point_2d{ lhs.x + rhs.x , lhs.y + rhs.y };
}
};
另一方面,除特殊情况外,必须避免直接调用构造函数。看到具有 Java 风格的新手 C++ 代码是很常见的。例如:
int main()
{
point_2d* point = new point_2d( 10.0f , 10.0f ); //Ok, this is not exactly a call to
//to the ctor, but has the same meaning.
//WTF why you use dynamic memory here?
}
或正确的 C++ 变量声明,然后是 Java 初始化:
int main()
{
point_2d point;
point = point_2d( 10.0f , 10.0f ); //WTF!!!
}
取决于编译器,或者如果优化被关闭(每个人都知道菜鸟永远不会启用优化......),这会导致:
- 调用 point_2d 构造函数(显式调用)
- 打电话给
point_2d::operator=
- 调用 point_2d 析构函数(破坏由 ctor 调用创建的时间)。
或者,最后,相同但所有内容都在同一行:
int main()
{
point_2d point = point_2d( 10.0f , 10.0f ); //WTF!!!
}
这是对 point_2d 构造函数的调用,然后是对 point_2d 复制构造函数的调用,以使用创建的时间初始化变量。
请注意,在这种情况下,性能不是重点,因为那不是 C++ 风格/做事方式。每个以这种方式编写 C++ 代码的人都应该去买一本好的 C++ 书。重新编写了有效的 C++以考虑即将到来的类似 Java 的程序员。