C++异常抛出空类
C++ Exceptions Throw Empty Class
以下摘录自"编程:使用C++的原理和实践"。我被throw Bad_area()表示法弄糊涂了。这本书试图解释它,"Bad_area()的意思是‘制作一个Bad_area'类型的对象",然后抛出该类型。这种解释与赋值符号不一致,例如int x=1==int x(1)或Bad_area x。
示例代码(注释掉了try块):
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";
}
Bad_area()
是对类Bad_area
的默认构造函数的显式调用
也就是说,throw Bad_area()
所做的是直接返回(抛出)类Bad_area
的一个匿名实例。
与Java或C#等OO语言中直接返回实例的情况相同。例如:
void foo() throws MyException
{
if( error ) throw new MyException();
}
请注意,在C++中很少使用对构造函数的显式调用,因为实例的生存期是基于RAII的
只有少数情况下显式调用是个好主意,其中大多数都像您的示例,返回语句。例如,一个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 };
}
};
另一方面,execpt指出,在特殊情况下,必须避免直接调用构造函数。使用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!!!
}
根据编译器的不同,或者如果优化被关闭(每个人都知道noobs从不启用优化…),这会导致:
- 对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类程序员的功劳。
相关文章:
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 尝试使用智能指针时引发异常
- 函数如何通知用户它基于函数原型抛出异常?
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Pytorch torch.cholesky忽略异常