C++友元和运算符重载

类的友元:

允许它们访问类对象中非公共的成员,就好像它们是类的成员一样,这种函数称为类的友元。友元可以访问类对象的任意成员。

可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元。

  1. 友元函数
  2. 友元类

友元函数:

友元函数是一种定义在类外部的普通函数,但它需要在类体内进行说明

为了与该类的成员函数加以区别,定义的方式是在类中用关键字friend说明该函数,格式如下:

friend  类型 友元函数名(参数表);

友元的作用在于提高程序的运行效率,但他破坏了C++的封装性

友元函数的注意事项

  1. 友元函数不是类的成员函数,在函数体中访问对象的成员,必须用对象名加运算符“.”加对象成员名。但友元函数可以访问类中的所有成员(公有的、私有的、保护的),一般函数只能访问类中的公有成员。
  2. 友元函数不受类中的访问权限关键字限制,可以把它放在类的公有、私有、保护部分,但结果一样。
  3. 某类的友元函数的作用域并非该类作用域。如果该友元函数是另一类的成员函数,则其作用域为另一类的作用域,否则与一般函数相同。
  4. 友元函数破坏了面向对象程序设计类的封装性,所以友元函数如不是必须使用,则尽可能少用。或者用其他手段保证封装性

友元类

如果某类B的成员函数会频繁的存取另一个类A的数据成员, 而A的数据成员的Private/Protectd限制造成B存取的麻烦, B只能通过Public的成员函数进行间接存取

把B做成A类的友元类,即A类向B类开放其Private/Protectd内容, 让B直接存取

友元类:一个类可以作另一个类的友元

友元类的所有成员函数都是另一个类的友元函数

友元类的定义:

friend class 类名;

运算符重载的概念

运算符重载类似于函数重载

运算符重载允许把标准运算符(如+、—、*、<等)应用于定制数据类型的对象

什么情况下需要考虑运算符重载?

需要用运算符操作自定义类的对象时,如对象之间直观自然,可以提高比较大小等,通过重载支持类的运算程序的可读性,体现了C++的可扩充性

运算符重载函数的定义2-1

作为类的成员函数或友元函数、作为一般函数(很少用)

( )  [ ]  ->   =  的重载函数必须是类的成员函数

成员函数原型的格式:

函数类型 operator 运算符(参数表);

成员函数定义的格式:

函数类型 类名::operator 运算符(参数表){

函数体;

}

以成员函数的方式重载运算符

单目运算符:不带参数,该类对象为唯一操作数

双目运算符:带一个参数,该类对象为左操作数、参数为右操作数  

运算符重载函数的定义2-2

友元函数原型的格式:

friend 函数类型 operator 运算符(参数表);

友元函数定义的格式:

函数类型 operator 运算符(参数表){

函数体;

}

以友元函数的方式重载运算符

单目运算符:带一个参数,该参数为唯一操作数,是自定义类的对象  ++(a)

双目运算符:带两个参数,第一个参数为左操作数、第二个参数为右操作数,至少有一个参数为自定义类的对象

   +(a, b)

自增、自减运算符重载2-1

在C++中,单目运算符有++和--,它们是变量自动增1和自动减1的运算符。在类中可以对这两个单目运算符进行重载。

前置自增和前置自减的重载

成员函数的方式重载,原型为:

函数类型 & operator++();

函数类型 & operator--();

友元函数的方式重载,原型为:

函数类型 & operator++(类类型 &);

函数类型 & operator--(类类型 &);

当函数要返回开辟的空间时,返回值类型不能取引用,因为开辟的空间等到函数结束时会释放掉,取引用与他共用一片空间.

自增、自减运算符重载2-2

后置自增和后置自减的重载

成员函数的方式重载,原型为:

函数类型  operator++(int);

函数类型  operator--(int);

友元函数的方式重载,原型为:

函数类型  operator++(类类型 &,int);

函数类型  operator--(类类型 &,int);

使用前缀运算符的语法格式

++<对象>;

使用后缀运算符的语法格式

<对象>++;

  • 22
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++中的运算符重载可以通过友元函数来实现。友元函数是定义在类外部的普通函数,但是可以访问类的所有私有成员。通过将运算符重载函数声明为类的友元函数,可以使该函数访问类的私有成员。 下面是一个示例代码,演示了如何通过友元函数实现运算符重载: ```c++ #include <iostream> class Complex { public: Complex(double real = 0.0, double imag = 0.0) : real_(real), imag_(imag) {} double real() const { return real_; } double imag() const { return imag_; } private: double real_; double imag_; friend Complex operator+(const Complex& c1, const Complex& c2); }; Complex operator+(const Complex& c1, const Complex& c2) { return Complex(c1.real_ + c2.real_, c1.imag_ + c2.imag_); } int main() { Complex c1(1.0, 2.0); Complex c2(3.0, 4.0); Complex c3 = c1 + c2; std::cout << "real: " << c3.real() << ", imag: " << c3.imag() << std::endl; return 0; } ``` 在上面的代码中,我们定义了一个Complex类,包含了两个私有成员变量real_和imag_,表示复数的实部和虚部。我们通过友元函数operator+来实现运算符重载,使得两个Complex对象可以通过"+"运算符相加。在友元函数operator+中,我们可以访问Complex类的私有成员变量real_和imag_,从而实现了运算符重载。 在main函数中,我们创建了两个Complex对象c1和c2,并通过运算符重载将它们相加,最终得到一个新的Complex对象c3。我们可以通过调用c3的real()和imag()方法来获取它的实部和虚部。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值