1. 友元函数:
作用:
- 可以在函数外部直接访问私有成员,但是友元破坏封装性
格式:
-
(类内)friend 函数类型 函数名(参数列表);
-
(类外)函数类型 函数名(参数列表){函数体};
说明:
-
友元不属于成员函数,在类外实现时不需要加上类解析(A::)
-
没有this指针,不受访问权限的控制
友元类:
-
格式:
- class 类名1{friend class 类名2;}
-
说明:
-
类名2是类名1的友元类
-
类名2可以访问类名1中的所有成员
-
友元类不常用,因为破坏封装
-
友元关系不能传递
-
2. 运算符重载:
含义: 由于类函数无法实现直接的加减运算因此对数据的运算函数需要自定义
格式:
- (类内)friend 类名 operator目标运算符(参数列表);
- 或
- (类内) 类名 operator 目标运算符(参数列表);
-
- (类外)类名 operator目标运算符(参数列表){函数体}
-
不可以进行运算符重载的操作符(5个) . :: ?: sizeof() ->
-
不能使用成员函数方式重载的运算符 << >>
-
不能通过友元函数方式重载的运算符 = () [] ->
说明:
-
运算符重载的形式可以是友元函数的形式也可以是成员函数的形式
-
成员函数有this指针,所以成员函数的运算符重载过程可以少些一个参数
-
对于不同类型的参数进行运算中,其返回值需要自己进行设计
-
一般双目运算符重载成友元 单目运算符重载成成员
-
如果想重载+ 而代码写成其它运算符的含义,代码不报错,且代码执行代码实现的含义
-
运算符重载必须是已经有的运算符,且不能改变其优先级
3. 补充:
- 运算符本质上是一种函数(在计算机中)
4. 代码实例
头文件
#pragma once
#include<iostream>
using namespace std;
class A
{
int data;
int arr[10];
public:
A(int data=0);
A(const A& other);
~A();
int getData();
void setData(int data);
friend int addData(const A&a, const A& b);
//运算符重载示例
//通过友元函数实现加法重载
friend A operator+(const A&a, const A&b);//加const防止修改 a b 的值
//通过成员函数实现减法重载
A operator-(const A& b);
//通过成员函数实现乘法重载
A operator*(const A&b);
//单目运算符重载示例 -a
A operator-