找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 1245|回复: 9

为什么是这个结果呢,哪位哥哥给解决一下

[复制链接]
发表于 2009-11-4 01:56:10 | 显示全部楼层 |阅读模式 IP:江苏扬州
#include<iostream.h>
class test{
private: int num;
public:
   
    test(int);
    void print();
~test();
};
test ::test(int n){num=n;cout<<"Initializing "<<num<<endl;}
void test::print(){cout<<num<<endl;}
test::~test(){cout<<"destrongin "<<num<<endl;}
void main(){
    test a(0);
    a=1;
    a.print();
    a=3;
    a.print();
    a=test(5);
    a.print();
}

结果是
Initializing  0
Initializing   1
destrongin   1
1
Initializing  3
destrongin   3
3
Initializing  5
destrongin   5
5
destrongin   5
很不明白,为什么这样,大师能否给解释一下

这个答案是对的,但是我不明白,为什么  构造完以后,马上就析构,我并没有调析构函数啊,而且啊,为什么都已经析构了,还能够用成员函数输出数据成员的值!  比如:
Initializing 1
destrongin 1
1

为什么第一个构造函数和最后一个析构函数对应,初始化为0以后不是,被改成1了么?怎么最后还要析构一个5呢?然后就给改成3,又是 5,而且这里还出现了赋值,给对象赋值,后来呢,不是赋值了,变成初始化了,总之,我都晕了!

请问这里一共建立了几个对象,为什么对象被析构了,还可以输出其中数据成员的值呢?另外这句话a=3,是什么意思,是重新建立一个对象呢,还是对上一个对象改变成员值呢?我还没有见过这样使用的呢,这里给一个数据成员赋值么?如果我有2个数据成员,那又给谁赋值啊?
发表于 2009-11-4 01:56:11 | 显示全部楼层 IP:江苏扬州
Initializing 0
Initializing 1
destrongin 1
1
Initializing 3
destrongin 3
3
Initializing 5
destrongin 5
5
回复

使用道具 举报

发表于 2009-11-4 01:56:12 | 显示全部楼层 IP:江苏扬州
应该是可以这样初始化对象吧!
回复

使用道具 举报

发表于 2009-11-4 01:56:13 | 显示全部楼层 IP:江苏扬州
看看这样说对不对。
变量的建立要调用构造函数,接着会调用析构函数。
其中第一个构造函数和最后一个析构函数对应。
回复

使用道具 举报

发表于 2009-11-4 01:56:14 | 显示全部楼层 IP:江苏扬州
那你觉得哪个不对??
回复

使用道具 举报

发表于 2009-11-4 01:56:15 | 显示全部楼层 IP:江苏扬州
这个答案是对的,但是我不明白,为什么  构造完以后,马上就析构,我并没有调析构函数啊,而且啊,为什么都已经析构了,还能够用成员函数输出数据成员的值!  比如:
Initializing 1
destrongin 1
1

为什么第一个构造函数和最后一个析构函数对应,初始化为0以后不是,被改成1了么?怎么最后还要析构一个5呢?然后就给改成3,又是 5,而且这里还出现了赋值,给对象赋值,后来呢,不是赋值了,变成初始化了,总之,我都晕了!

请问这里一共建立了几个对象,为什么对象被析构了,还可以输出其中数据成员的值呢?另外这句话a=3,是什么意思,是重新建立一个对象呢,还是对上一个对象改变成员值呢?我还没有见过这样使用的呢,这里给一个数据成员赋值么?如果我有2个数据成员,那又给谁赋值啊?
回复

使用道具 举报

发表于 2009-11-4 01:56:16 | 显示全部楼层 IP:江苏扬州
你可以少用几个测试,搞那么多当然容易晕
    test a(0);
    cout<<"over0"<<endl;
    a=1;
    a=3;
    cout<<"over3"<<endl;
输出:
Initializing 0
over0
Initializing 1
destrongin 1
Initializing 3
destrongin 3
over3
destrongin 3
Press any key to continue
构造与析构的次数一样
第一次构造没有析构,因为要到"}"才析构
因为有一个没有析构,所以一直可以调用print
回复

使用道具 举报

发表于 2009-11-4 01:56:17 | 显示全部楼层 IP:江苏扬州
我想LZ是想问为什么会有最后那句
destrongin   5
吧....
你的问题是为什么不先print再析构,而是先析构,而后print调用吧...
回复

使用道具 举报

发表于 2009-11-4 01:56:19 | 显示全部楼层 IP:江苏扬州
C++中,,带有一个参数的构造函数 比如说你的Test(int n) //建议:类名首字符要大写
a=1;这句话是这样执行的,,C++调用了带一个参数的构造函数 将int类型的1转换成类类型.这个构造函数创建了一个临时对象,所以调用构造函数.把1的值存放到对象中.然后,在把这个临时对象赋值给对象a,a=1;执行完后,临时对象死亡,所以调用析构函数.
明白了吗?哈哈哈...这个答案是对的!
简单说,就是带有一个参数的构造函数Test(int n) 把int类型转换成类类型了,生成了一个临时对象.
回复

使用道具 举报

发表于 2009-11-4 01:56:20 | 显示全部楼层 IP:江苏扬州
如果你想把类类型转换成内置数据类型,需要使用转换函数.
比如说,你想把类Test转换成int类型,应该在成员函数中添加下面这个转换函数:
operator int() const;

实现是这样的:
Test::operator int()const
{
   return 5;  //这里转换成5
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-10-1 05:27 , Processed in 0.195935 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表