读书人

构造析构函数的有关问题

发布时间: 2012-02-27 10:00:22 作者: rapoo

构造析构函数的问题
#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语句匹配才结束(或者无匹配时,直到程序异常,中止时析构结束)
[解决办法]
编译器优化技术
理论上的就是所说的上面那样的
对于临时对象的维护,不同的编译器存在不同的优化技术以提高效率

读书人网 >C++

热点推荐