首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

构造析构函数的有关问题

2012-02-27 
构造析构函数的问题#includeiostreamclassxBoundary{public://constructorsxBoundary()xBoundary(const

构造析构函数的问题
#include   <iostream>

class   xBoundary
{
public:
        //   constructors
        xBoundary();
        xBoundary(const   int   index);
        ~xBoundary();

        //   accessor
        int   ErrIndex()   const   {return   myIndex;}
 
private:
        int   myIndex;
};

//   implementations
//   The   constructors   merely   print   out   a   message
//   indicating   they   have   bee   called,   along   with
//   the   value   of   their   myIndex   property.
xBoundary::xBoundary():
myIndex(-1)
{
        std::cout   < <   "xBoundary()   ->   myIndex= "   < <   myIndex   < <   "\n ";
}

xBoundary::xBoundary(const   int   index):
myIndex(index)
{
        std::cout   < <   "xBoundary(const   int)   ->   myIndex= "   < <   myIndex   < <   "\n ";
}

xBoundary::~xBoundary()
{
        std::cout   < <   "~xBoundary()   ->   myIndex= "   < <   myIndex   < <   "\n ";
}

int   main()
{
        const   int   defaultSize   =   10;
        const   int   someOtherNumber   =   11;
        int   myArray[defaultSize];
        for   (int   i   =   0;   i   <   defaultSize;   i++)
                myArray[i]   =   i;
        try
        {
                for   (int   i   =   0;   i   <   someOtherNumber;   i++)
                {
                        if   (i   > =   defaultSize)
                                throw   xBoundary(i);
                        else
                                std::cout   < <   "myArray[ "   < <   i   < <   "]:\t "   < <   myArray[i]   < <   "\n ";
                }
        }
        catch(xBoundary   err)
        {
                std::cout   < <   "Failed   to   retrieve   data   at   index   "   < <   err.ErrIndex()   < <   ".\n ";
        }
        return   0;
}
看这个例子,为什么会有三次析构函数的调用?  


三个对象:
throw   xBoundary(i)里一个
临时对象一个
还有哪个?

却没有调用三个构造函数xBoundary::xBoundary(const   int   index),这个是为什么啊



[解决办法]
单步运行此程序不就明白了嘛 ~

运行一步看一次运行结果界面,
这么几行代码,
很快就知道在哪里执行了你要找的析构了 ~~
[解决办法]
throw xBoundary(i);
一个临时对象,构造函数xBoundary::xBoundary(const int index),析构
一个异常对象,用临时对象拷贝构造(使用默认拷贝构造函数,你这里未显式的提供),析构
一个局部对象xBoundary err,用异常对象拷贝构造,析构
所以三次
只用一个xBoundary(const int index),其他两个构造的使用的是拷贝构造函数,编译器的提供
[解决办法]
throw xBoundary(i);//这句包括一个临时对象和一个异常对象吗?
=============================
你可以这样理解,但实际上,xBoundary(i)构造了个临时对象,
而异常对象的构造是系统自动维护的,它只是使用了你这个临时对象来拷贝构造,完成建立
可以这么说,系统等待你这个对象构造之后,去拷贝构造异常对象,它的生命期由系统接管,一直到存在catch语句匹配才结束(或者无匹配时,直到程序异常,中止时析构结束)
[解决办法]
编译器优化技术
理论上的就是所说的上面那样的
对于临时对象的维护,不同的编译器存在不同的优化技术以提高效率

热点排行