C++中一个类的成员函数作为另一个类的友元函数的问题,问题在下面的/*``*/中,希望解释的详细点,谢谢了

#include<iostream>
#include<string.h>
using namespace std;
class student;
class teacher
{
private:
int bh;
char name[10];
public:
teacher(int h,char n[])
{
bh=h;
strcpy(name,n);
}
void display()
{
cout<<"bh:"<<bh<<endl;
cout<<"name:"<<name<<endl;
}
void modify_stu(student,float); /*student不是一个类名吗?怎么成形参的参数类型了*/
};
class student
{
private:
int id;
float score;
public:
student(int xh,float s)
{
id=xh;
score=s;
}
void display()
{
cout<<"id:"<<id<<endl;
cout<<"score:"<<score<<endl;
}
friend void teacher::modify_stu(student,float); /* */
};
void teacher::modify_stu(student c,float s)
/*这里的c是student的对象吧,用在这里的意思是要调用score吧?*/

{
c.score=s;
}
void main()
{
teacher t1(1000,"王琳");
t1.display();
student wc(1022,67);
wc.display();
t1.modify_stu(wc,89);
/*这个wc是student的对象,怎么不能用c 为什么要用wc*/

wc.display();
}

/*student不是一个类名吗?怎么成形参的参数类型了*/
类也是一个类型啊 ,当然可以做为一个函数的形参类型啦

/*这里的c是student的对象吧,用在这里的意思是要调用score吧?*/
嗯,为了让teacher对象调用student对象的私有成员

/*这个wc是student的对象,怎么不能用c 为什么要用wc*/
这个问题实在是。。。
WC 是形参C的实参
可以这么说吧, c指向的是wc指向的对象,相当于c=wc追问

可能是我表达的问题,我的困惑在于 student wc(1022,67);这一句中把wc作为了student的对象,而 这一句t1.modify_stu(wc,89); 为什么要用wc作为c的实参,形参和是实参的关系我知道,形参是函数和调用函数之间传递数值的, 还有一个wc是c的实参,那他的值是(1022,67)?怎样传递给函数modify_stu(student c,float s)呢?

追答

student wc(1022,67);这一句的意思是构造一个student对象的实例 wc。
modify_stu(student ,float) 的函数形参表中有一个student类型的对象,在调用改函数需要给他一个student类型的对象作为实参,不然系统无法调用改函数!
值的传递: 函数接受的是该变量的一个副本,即在调用函数时,形参和实参会有一个赋值的操作,你可单步看反汇编。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-05
void modify_stu(student,float); student就是类名,类名就代表一种数据类型啊,声明时只需确定形参类型,可以不要形参名,如friend void teacher::modify_stu(student,float);

函数实现时若函数内部需要形参的相关运算,则必须有形参名供使用,如
void teacher::modify_stu(student c,float s)

wc在这里是实参,调用函数时,编译器会将实参传递给形参c。若直接用c,你的c是未定义的标示符啊

建议你看一哈函数的参数关系追问

可能是我表达的问题,我的困惑在于 student wc(1022,67);这一句中把wc作为了student的对象,而 这一句t1.modify_stu(wc,89); 为什么要用wc作为c的实参,形参和是实参的关系我知道,形参是函数和调用函数之间传递数值的, 还有一个wc是c的实参,那他的值是(1022,67)?怎样传递给函数modify_stu(student c,float s)呢?

追答

实参 就是一个实实在在的对象,是实际存在的,你要修改谁的值,就传谁啊,这里你要修改学生wc(包括学号,成绩)的成绩,就传wc啊,进入函数体以后c就是你要操作的学生wc

追问

“这里你要修改学生wc(包括学号,成绩)的成绩,就传wc啊,修改学生wc的值是多少呢?
void teacher::modify_stu(student c,float s)

{
c.score=s;
}

这一块我还是不太懂……不吝赐教啊,谢谢

追答

学生是一个类,类似于c语言中的结构体,它包含了学号、成绩等信息,它的值是由其成员变量学号成绩等决定的

第2个回答  2013-03-05
所有的类型都可以做函数的参数;但要在一定的条件下才可以的;实参和形参都是要在具体调用某个具体的实体时起作用。
每一次参数的调用都意味着数据的变化,都要具体的,当是实体是一个类的时候就要具体到类里的那一个成员。
第3个回答  2013-03-05
c是形参,wc是实参