C++学习记录————友元与重载

目录

一、友元介绍

1. 友元函数(重点)

2. 友元类(熟悉)

3. 友元成员函数

二、重载

1. 加号的友元函数重载

2. 加号的成员函数重载

3. 运算符重载

3.1 自加操作符友元函数重载

3.2 自加操作符的成员函数重载

3.3 赋值运算符重载(掌握)

3.4 类型转换运算符(熟悉)

注意事项

运算符重载注意事项:(熟悉)


一、友元介绍

类实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,仅能通过类的成员函数才能读写。如果数据成员定义为公共的,则又破坏了封装性。但是某些情况下,需要频繁读写类的数据成员,特别是在对某些成员函数多次调用时,由于参数传递、类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。

友元主要是用于运算符重载

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++中,运算符的操作对象只能是基本数据类型。自定义类型是不能直接使用,所有运算重载对已有的运算符赋予多重含义。使同一个运算符作用与不同类型数据做出不同的行为

运算符重

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值