C++友元函数的问题

来源:百度知道 编辑:UC知道 时间:2024/06/21 15:26:40
这是一个一个错误的程序原因是友元函数参数里用的是对象 但只要换成对象指针就可以 (改在后面一个程序里) 这是什么原因呢?

#include<iostream>
using namespace std;
class CSample
{
public:
CSample( void ){ };
int MemberFunc( void )
{
return i;
}
friend void FriendFunc2(CSample p,int a){
p.i=a;
}
private:
int i;
};
void main( void )
{
CSample p1;
FriendFunc2(p1, 5);
cout << "i=" << p1.MemberFunc()<<endl;
cin.get();
}

改后的程序
#include<iostream>
using namespace std;
class CSample
{
public:
CSample( void ){ };
int MemberFunc( void )
{
return i;
}
friend void FriendFunc2(CSample*p,int a){
p->i=a;
}
private:
int i;
};
void main( void )
{
CSample*p1;
CSample p;
p1=&p;
FriendFunc2(p1, 5);

不用指针的话,友元函数参数中的 CSample p 这个 p 只是你传入函数的参数的一个副本,修改这个副本并不影响原来的值。举一个简单的例子吧,看如下代码:
#include<iostream>
using namespace std;

void change( int rhs, int a )
{
rhs = a;
}
int main()
{
int i = 0;
change( i, 5 );
cout << i << endl;
return 0;
}

这个程序经调用 change 后,原来 i 的值并没有改变。但是改为如下代码:

void change( int * rhs, int a )
{
*rhs = a;
}
int main()
{
int i = 0;
change( &i, 5 );
cout << i << endl;
return 0;
}

此时调用函数后,i 的值改变了。

这个例子,我想,在相关教材中,讲到函数参数是指针时,肯定会有类似的例子来说明函数调用的参数传递问题。如果明白了这个,那么你所提出的问题就解决了,原因是一样的。

原来那个程序没错啊.......
我用DEV C编译通过了啊......

VS2005下编译也通过了
不过结果不对

这里因为返回了一个参数的值
应该使用传值调用或者引用调用
friend void FriendFunc2(CSample*p,int a)
或者
friend void FriendFunc2(CSample&p,int a)

object a是传值
object *a是传地址