2

以下是“编程:使用 C++ 的原理和实践”的节选。我对throw Bad_area()表示法感到困惑。这本书试图解释它,“Bad_area() 的意思是'创建一个 Bad_area 类型的对象'”,然后继续抛出该类型。这种解释与赋值符号不一致,例如。整数 x=1 == 整数 x(1); Bad_area x;.

示例代码(注释掉 try-block):

class Bad_area {}; // a type specifically for reporting errors from area()

// calculate area of a rectangle
// throw a Bad_area exception in case of a bad argument
int area(int length, int width)
{
  if (length<=0 || width<=0) throw Bad_area();
  return length*width;
}

int main()
try {
  // ...
}
catch (Bad_area) {
  cout << "Oop! bad arguments to area()\n";
}
4

1 回答 1

2

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 的程序员。

于 2013-08-15T08:23:44.403 回答