先看下面的代码
首先报错的原因是,Gril的属性设置成私有了,你怎么可能在Boy里面直接访问到?
在java中通常的解决方法是写一个getName(),getAge()。这样你就可以访问到了啊。
c++中有友元函数,便巧妙的解决了数据共享。
加一句话就行了:夹在16~17行
friend void Boy::disp(Girl &);
这一行就是想说我允许了Boy的disp函数中可以直接操作Gril的成员。
形参由 类型+形参变量名组成。
加&符号表示引用。
void add1(int b) {
b = 3;
}
void add2(int &b) {
b = 3;
}
int main() {
int a = 1;
int c = 1;
add1(a);//a没有被修改
add2(c);//修改了
cout << a << " " << c << endl;
}
输出结果是 1 3.
因为一个是值传递,一个是地址传递。
反看开头的代码:
如果这么写:(把传进来的Girl类型的x做一下修改)
#include<iostream>
#include<string>
using namespace std;
class Girl;
class Boy
{
public:
void disp(Girl &x);
};
class Girl
{
public:
Girl(int age, string name) {
this->age = age;
this->name = name;
}
void showGril() {
cout << age << name << endl;
}
friend void Boy::disp(Girl &x);
private:
int age;
string name;
};
void Boy::disp(Girl &x)
{
cout << "girl's name is:" << x.name << ",age:" << x.age << endl;
x.age = 18;
x.name = "wanjun";
}
int main() {
Boy b;
Girl g(3, "万俊");
g.showGril();
b.disp(g);
g.showGril();
}
可以看到两次showGril结果不一样了。
但是取地址符号去了呢?
关于&符号
有引用,还有取地址功能,详细请看
https://blog.csdn.net/qq_26501341/article/details/58192662
。
void disp(Girl &x);
这个x在函数声明中可以去掉为什么呢?