目录
一、友元介绍
类实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,仅能通过类的成员函数才能读写。如果数据成员定义为公共的,则又破坏了封装性。但是某些情况下,需要频繁读写类的数据成员,特别是在对某些成员函数多次调用时,由于参数传递、类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。
友元主要是用于运算符重载
1. 友元函数(重点)
友元函数是定义在类外部的普通函数,需要类中使用frend关键字进行说明,友元函数就可以访问类中的私有成员
特点:
1.友元函数不是类的成员,所有没有this指针。所以参数应该是对象的引用,用于访问类中成员
2.不是类中函数,所有不受类中权限修饰符的限制,可以写在任意位置
#include <iostream>
using namespace std;
class Person{
private:
string ID;
string phoneNum;
public:
Person(string id,string phoneNum){
this->ID=id;
this->phoneNum=phoneNum;
}
friend void test_friend(Person& p);
};
void test_friend(Person& p){
cout<<p.ID<<" "<<p.phoneNum<<endl;
}
int main()
{
Person p("23033","180XX8888");
test_friend(p);
}
2. 友元类(熟悉)
当一个类是另一个类的友元类时,它就可以访问另一个类中所有的成员
#include <iostream>
using namespace std;
class A{
private:
int value;
public:
A(int n):value(n){}
friend class B; //声明B是A的友元类,B就可以访问A中所有成员
};
class B{
public:
void testFriendClass(A& class_a){
cout<<class_a.value<<endl;
}
};
int main()
{
A obj_a(10);
B obj_b;
obj_b.testFriendClass(obj_a);
}
3. 友元成员函数
如果类B的某一个成员函数是可以访问类A的所有成员,则这个成员函数就是类A的友元成员函数。
#include <iostream>
using namespace std;
//3、因为类B中用到了类A,因此在类B之前需要声明类A
class A;
//2、由于类A用到类B,因此类B的代码写在类A之前
class B
{
public:
void test_friend(A& a); //先只声明函数
};
class A
{
private:
string str;
public:
A(string str):str(str){}
string get_str() const
{
return str;
}
// 1、确定友元成员函数的格式并且友元声明
friend void B::test_friend(A& a);
};
//4、最后:完成友元成员函数的定义
void B::test_friend(A &a)
{
a.str = "多云";
}
int main()
{
A a("小雨");
B b;
b.test_friend(a);
cout << a.get_str() << endl; //多云
return 0;
}
二、运算符重载
在C++中,运算符的操作对象只能是基本数据类型。自定义类型是不能直接使用,所有运算重载对已有的运算符赋予多重含义。使同一个运算符作用与不同类型数据做出不同的行为
运算符重