回 帖 发 新 帖 刷新版面

主题:c++引用的问题


istream& cii=cin(ostream& coo=cout)和istream cii=cin(ostream coo=cout)运行效果一样,我想知道具体有什么区别
[code=c] #include <iostream>
using namespace std;
int main()
{ int x,y;
istream cii=cin;
ostream coo=cout;
cii>>x>>y;
coo<<x<<" "<<y<<endl;
return 0;
}
[/code]

回复列表 (共7个回复)

沙发

引用其实就是一个别名,就像鲁迅是周树人的别名一样,他两效果当然一样了

板凳

当然有区别
引用只是原变量的别名,而值传递则是开辟了一个局部对象。更具体的区别在于如果你的引用不是const,那么你在函数中对形参进行的修改会改变实参的值

3 楼


istream cii=cin;
ostream coo=cout;
如果这个地方不用引用,即
istream &cii=cin;
ostream &coo=cout;
就会出现问题  因为在namespace std中
构造函数定义为:
private:
    ios_base(const ios_base&);
很明显这个地方可以看出 这个copy constructor是private 
所以这两句istream cii=cin; ostream coo=cout;
中定义变量后调用copy constructor就会出现错误

4 楼


问题是我的编译都通过了,没有报错。我用的是VC6.0
而且两种运行结果是一样的

5 楼


如果是在DEV C++编译器下就会报错

6 楼

根据kikiloer在4楼的反馈,楼主的代码至少存在一个问题:它的可移植性较差。
顺带一提,我用Visual C++ 2008 Express编译楼主的代码,也报错。

标准似乎没有规定std::istream对象是可以被拷贝构造的,而照我的理解,可以被继承的对象一般都是不可以被拷贝构造的——即使你可以提供拷贝构造函数的声明,也无法定义出一个比较完善的拷贝构造函数来。

以std::istream为例,如果它支持拷贝构造,也就是说可以有这样一个构造函数istream(const istream& other);这样一来,如下的代码就可以编译成功:
std::ifstream file_stream("1.txt");
std::istream stream = file_stream; // std::ifstream也是std::ifstream,编译正确!?
从感觉上讲,这不太对劲。

看这段代码:[code=c]class A
{
public:
    int i;
};

class B : public A
{
public:
    int j;
};

int main()
{
    B b;
    b.i = 10;
    b.j = 20;

    A a = b;
    return 0;
}[/code]

注意最后一句,虽然编译通过,但实际上却是不妥的。因为a只有一个数据成员,但b却有两个数据成员,这里没有什么办法可以把b的所有数据都拷贝到a。
C++默认的拷贝构造函数,会进行成员逐一拷贝,所以上面的“A a = b;”只会把b.i拷贝到a.i,而b.j不会被拷贝。在这种情况下,数据被截断了(一部分被拷贝,一部分被舍弃),这虽然可以通过编译,却通常不是我们想要的正确结果。
即使我们屏蔽掉C++默认的拷贝构造函数,自己重新定义一个新的拷贝构造函数,情况也不会好转。因为容量不够,总会有数据被丢掉。除非重新设计,让B的成员数量与A的成员数量一样多。就算真的这样设计了,也无法解决根本问题:假设某天我又定义一个class C : public A,那时如果C又确实需要更多的容量,那我们的代码就没有办法维护了。因为派生类的影响而修改基类,那也不是面向对象应该具有的精神。

7 楼


深圳华信群英科技有限公司,目前主要从事软件外包开发、高级软件人才定向输送等业务,面对日益严峻的大学生就业难和IT企业招聘难,自2006以来,与知名通信软件公司正式签订定向输送人才的合作协议,针对想进入软件行业的人员提供企业实训,实训课程采用“2+3”分段教学模式,分为2个月理论强化和3个月项目实训两个阶段,共计900学时。
企业订单委培,内训前签订就业安置协议,100%保证就业。实训结束之后,在华信群英科技及其战略合作伙伴从事通信软件研发工作。欢迎有意向者加QQ:649846168咨询。

我来回复

您尚未登录,请登录后再回复。点此登录或注册