本文通过一个简单的程序来分析一下构造和析构函数
#include
"
stdio.h
"
#include < string >
#include < iostream >
using namespace std;
class Test
{
public:
Test();//line 9
Test(int newValue, const string& newString); //line 10
~Test();
private:
int value;
string testStr;
} ;
Test::Test():value( 0 ),testStr( "" )
{}
Test::Test( int newValue, const string & newString)
{
value = newValue;
testStr = newString;
}
Test:: ~ Test()
{
static int deCount = -1;
cout << testStr << " is destructed #"<< ++deCount << endl;
}
int main()
{
{
Test test0 = Test(0,"test0"); //line 29
}//line 30
Test test1 ;
test1= Test(1, "test1"); //line 32
test1 = Test(1, "new test1"); //line 33
Test test2; //line 34
test2 = Test(2, "test2"); //lien 35
test2 = test1; //line 36
Test *test3;
test3 = new Test(3, "test3"); //line 38
Test test4 = *test3; //line 39
}
对于一个类而言,如果没有显式的构造函数,编译器会自动生成一个默认构造函数。若用户已经定义了
含有1个或多个参数的构造函数,如line10所示。而用户没有显式生成一个默认构造函数的话,则编译
将会出错(屏蔽line9,则line31出错)。可见编译器自动生成一个默认构造函数是有前提的,即该类没有
任何其他的构造函数。
析构函数在本对象所在代码块结束时被调用,如在本程序中test0的析构函数在line29的}处被调用。
我们知道,编译器按照栈的结构进行析构,即最先构造的对象最后被析构。然而#1 的结果却让人困惑,test1刚构造就被析构,此时代码块也没结束。这是为什么呢?原来,在调用返回对象值的函数的时候会产生临时对象,例如构造函数。临时对象创建后即被析构,所以会有#1,#2的情况出现。而对于line37动态创建的对象,并不产生一个临时对象,正在输出#4的语句是line39。#5,#6是对象被赋值后析构的情况。
本程序运行结果:
test1 is destructed #1
new test1 is destructed #2
test2 is destructed #3
test3 is destructed #4
new test1 is destructed #5
new test1 is destructed #6
#include < string >
#include < iostream >
using namespace std;
class Test
{
public:
Test();//line 9
Test(int newValue, const string& newString); //line 10
~Test();
private:
int value;
string testStr;
} ;
Test::Test():value( 0 ),testStr( "" )
{}
Test::Test( int newValue, const string & newString)
{
value = newValue;
testStr = newString;
}
Test:: ~ Test()
{
static int deCount = -1;
cout << testStr << " is destructed #"<< ++deCount << endl;
}
int main()
{
{
Test test0 = Test(0,"test0"); //line 29
}//line 30
Test test1 ;
test1= Test(1, "test1"); //line 32
test1 = Test(1, "new test1"); //line 33
Test test2; //line 34
test2 = Test(2, "test2"); //lien 35
test2 = test1; //line 36
Test *test3;
test3 = new Test(3, "test3"); //line 38
Test test4 = *test3; //line 39
}
对于一个类而言,如果没有显式的构造函数,编译器会自动生成一个默认构造函数。若用户已经定义了
含有1个或多个参数的构造函数,如line10所示。而用户没有显式生成一个默认构造函数的话,则编译
将会出错(屏蔽line9,则line31出错)。可见编译器自动生成一个默认构造函数是有前提的,即该类没有
任何其他的构造函数。
析构函数在本对象所在代码块结束时被调用,如在本程序中test0的析构函数在line29的}处被调用。
我们知道,编译器按照栈的结构进行析构,即最先构造的对象最后被析构。然而#1 的结果却让人困惑,test1刚构造就被析构,此时代码块也没结束。这是为什么呢?原来,在调用返回对象值的函数的时候会产生临时对象,例如构造函数。临时对象创建后即被析构,所以会有#1,#2的情况出现。而对于line37动态创建的对象,并不产生一个临时对象,正在输出#4的语句是line39。#5,#6是对象被赋值后析构的情况。
本程序运行结果:
test1 is destructed #1
new test1 is destructed #2
test2 is destructed #3
test3 is destructed #4
new test1 is destructed #5
new test1 is destructed #6