| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 466 人关注过本帖
标题:关于类的一个简单问题,请教各位啊
只看楼主 加入收藏
raul665
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2011-8-31
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
关于类的一个简单问题,请教各位啊
一段非常简单的代码:
#include<iostream>
using namespace std;
class Time
{
public:
    int hour;
    int minute;
    int second;
};
void main()
{
    void set(Time&);
    void get(Time&);
    Time  t1;
    set(t1);
    get(t1);
}
void set(Time &t)
{
    cin>>t.hour;
    cin>>t.minute;
    cin>>t.second;
}
void get(Time &t)
{
    cout<<t.hour<<t.minute<<t.second;
}
我想问一下,set函数的形参为什么必须是引用类型Time &啊?为什么不能直接是类Time的类型,即写成以下
void set(Time t)
{
    cin>>t.hour;
    cin>>t.minute;
    cin>>t.second;
}如果这样写会出现警告:实参t1没有初始化,运行时也会出现一个随机数而不是自己输数
哪位高手给解释下,谢过了!!
搜索更多相关主题的帖子: void include public minute void include public minute 
2011-08-31 10:22
xg5699
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:140
专家分:522
注 册:2011-7-27
收藏
得分:10 
只调用一个set函数就不会出错,你把输入和输出
并在一个set函数里就没问题。
至于为什么呢,那使因为你不加引用就是按值传递
按值传递会调用复制构造函数讲T1拷贝给time类的临时对象
这些工作在复制构造函数中进行的。
按值传递的优点是不会对原有的数据进行修改,任何对象的
操作都是由临时对象来完成的,和你原本对象T1没有关系
当函数结束时会自动销毁临时对象,所以第2个输出函数set
中又临时拷贝了个对象,还是从T1拷贝的,因为是按值传递
对象T1的值没有被储存是默认值,在输入的set函数结束时那个
临时对象被销毁。
所以输出的set函数永远输出的是T1的默认值。

都不结贴我郁闷那!
2011-08-31 10:56
jcw08120110
Rank: 8Rank: 8
来 自:南京
等 级:蝙蝠侠
帖 子:272
专家分:742
注 册:2009-6-8
收藏
得分:10 
void set(Time &t) 这里的作用就是 传递的是引用 一般而言 引用的作用就是给对象赋值;也可以说是引用的对象可以作为左值; 你这里cin>>t.hour; 想给T赋值;那么就是把t作为左值(等号左边的值);另外引用的另一个用处就是在传递参数的过程中保留改变的值; 那么既然你想给t1对象赋值,如果你传递的是对象的话;那么函数中的改变不会影响到原来t1中的值;解决办法传递引用或者传递指针; 你这里的警告的意思就是 t1 没有赋值; 虽然你用函数传递了对象并在函数中赋值;但是这个赋值是无效的;所以你现在的t1还只是没用任何意义的空对象;所以有警告;而不是错误;

君生我未生 我生君以老
2011-08-31 11:26
raul665
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2011-8-31
收藏
得分:0 
回复 2楼 xg5699
谢谢啊,没想到这个论坛的人真给力啊,回帖很快~
2011-08-31 12:47
raul665
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2011-8-31
收藏
得分:0 
回复 3楼 jcw08120110
谢谢啊~没想到这个论坛的人真给力,回帖很快啊
2011-08-31 12:48
快速回复:关于类的一个简单问题,请教各位啊
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030149 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved