1.类中的友元函数,可以无视private protected等修饰符,直接访问类中的所有成员。而且友元函数不受private protected等修饰符的限制,只要写了就是public。
#include <iostream>
using namespace std;
class A{
private:const int h=55;
protected:const int m=10;
void print() { cout << "ssss" << endl; }
public:
int x;
A(int x1) { x = x1; cout << "调用了a的构造函数" << endl; }
friend void fri(class A);
};
void fri(class A xingcanlei)
{
cout << xingcanlei.h << xingcanlei.x << xingcanlei.m;
xingcanlei.print();
}
int main()
{
A a(22);
fri(a);
system("pause");
}
在刚才那段代码上加了返回类类型,
#include <iostream>
using namespace std;
class A{
private:const int h=55; void print() { cout << "ssss" << endl; }
protected:const int m=10;
public:
int x;
A(int x1) { x = x1; cout << "调用了a的构造函数" << endl; }
friend A fri(class A);
};
A fri(class A xingcanlei)
{
cout << xingcanlei.h << xingcanlei.x << xingcanlei.m;
A c(xingcanlei.h + xingcanlei.x);
return c;
}
int main()
{
A a(22);
A b=fri(a);//这句就不会新建一个b了,而是直接让b指向在友元函数fri中创建的对象c,所以只会生成两个A对象,调用两次构造函数
system("pause");
}
2.友元类
定义一个类A为类B的友元类,就可以在a中写个函数,访问b中的所有属性,不管是private还是protected
#include<iostream>
#include <string>
using namespace std;
class B
{
int y;
public:
int h;
int *p;
B(int b) { y = b; cout << "调用了b的构造函数" << y << endl; p = &h; }//构造函数只有原来的类才能执行,在拷贝时生成的b2时,不能执行
friend class A;
};
class A
{
public:
void alert(class B b)
{
cout<<b.y;
}
};
void main(void)
{
B b1(10);
A a1;
a1.alert(b1);
int a;
system("pause");
}
友元不可以继承
#include<iostream>
#include <string>
using namespace std;
class B
{
int y;
public:
int h;
int *p;
B(int b) { y = b; cout << "调用了b的构造函数" << y << endl; p = &h; }//构造函数只有原来的类才能执行,在拷贝时生成的b2时,不能执行
friend class A;
};
class A
{
public:
void alert(class B b)
{
cout << b.y;
}
};
class C:public B
{
public:
void alert(class B b)
{
cout << b.y;//这里会报错,因为c没有继承那句friend
}
};
void main(void)
{
B b1(10);
A a1;
a1.alert(b1);
int a;
system("pause");
}
友元关系不能继承。基类的友元对基类的子类的成员没有特殊访问权限。