浅析构造函数和析构函数

 

本文通过一个简单的程序来分析一下构造和析构函数
#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
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值