丰富多彩的C++代码解析

下面着重讲述学习C++时碰到的相关难题和问题,以及学习C++的技巧,如何更好的进行C++代码解析,下文除了学习C++代码的基本编程技巧外还对C++代码的新特性进行全面研究。

成都创新互联长期为1000多家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为旌德企业提供专业的成都网站设计、成都网站建设,旌德网站改版等技术服务。拥有十多年丰富建站经验和众多成功案例,为您定制开发。

所以 v 应该调用它们的析构函数。但是假设在这个调用期间,第二个 Widgets 的析构函数又抛出一个异常。现在有两个异常同时在活动中,对于C++代码解析来说这太多了。在非常巧合的条件下发生这样两个同时活动的异常,程序的执行会终止或者引发未定义行为。

在本例中,将引发未定义行为。与此相同,使用任何标准库容器(比如,list,set),任何 TR1中的容器,甚至是一个数组,都可能会引发未定义问题。并非必须是容器或数组才会陷入麻烦。程序夭折或未定义行为是析构函数引发异常的结果。

即使没有使用容器或数组也会如此。C++ 不喜欢引发异常的析构函数。 这比较容易理解,但是如果你的析构函数需要执行一个可能失败而抛出异常的操作,该怎么办呢?例如,假设你与一个数据库连接类一起C++代码解析:

 
 
 
  1. class Widget {
  2.  public:
  3.   ...
  4.   ~Widget() { ... } // assume this might emit an exception
  5. };
  6. void doSomething()
  7. {
  8.  std::vector v;
  9.  ...
  10. } // v is automatically destroyed here 

为了确保客户不会忘记调用 DBconnection 对象的 close,一个合理的主意是为 DBConnection 建立一个资源管理类,在它的析构函数中调用 close。这样的资源管理类将在以后的文章中探讨,但在这里,只要认为这样一个类的析构函数看起来像这样就足够了:

 
 
 
  1. class DBConn { // class to manage DBConnection
  2.  public: // objects
  3.   ...
  4.   ~DBConn() // make sure database connections
  5.   { // are always closed
  6.    db.close();
  7.   }
  8.  private:
  9.   DBConnection db;
  10. }; 
  11.   它允许客户像这样编程:
  12.  // open a block
  13.  DBConn dbc(DBConnection::create()); // create DBConnection object
  14.  // and turn it over to a DBConn
  15.  // object to manage
  16.  ... // use the DBConnection object
  17.  // via the DBConn interface
  18. } // at end of block, the DBConn
  19. // object is destroyed, thus
  20. // automatically calling close on
  21. // the DBConnection object 

既然能成功地进行C++代码解析那就好了,但是如果这个调用导致了异常,DBConn 的析构函数将散播那个异常,也就是说,它将离开析构函数。这就产生了问题,因为析构函数抛出了一个烫手的山芋。

分享名称:丰富多彩的C++代码解析
网页URL:http://www.mswzjz.com/qtweb/news22/196122.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联