Version 3.0
友员第七章
2
回顾
文件输入
文件输出
异常处理
3
目标
友元函数
友元类
操作符重载
4
友元函数 4-1
非成员函数不能访问私有成员
友员函数允许访问类的私有部分而不是成员
5
友元函数 4-2
类友元函数私有 !
6
友元函数 4-3
class teacher
{
private:
int a;
public:
teacher()
{
a = 5;
}
friend int stud(teacher);
};
int stud(teacher t1)
{
return (t1.a); //因为 stud()是一个友元
}
没有 friend
7
友元函数 4-4
class Teacher; //前向声明
class Student {
private:
int st_data;
public:
void getstuddata();
friend void display(Student abc,Teacher xyz);
};
class Teacher {
private:
int th_data;
public:
void getteachdata();
friend void display(Student abc,Teacher xyz);
};
void display(Student abc,Teacher xyz) {
//某些代码
} 我是大家的朋友类只有在声明之后才能被引用
8
友元函数的特性
拥有访问类的私有部分的权限
没有 this 指针
可以置于类说明的私有或公有部分
定义友元函数时,不需要使用类名和作用域解析操作符作为前缀
9
优点
在接口设计的选择方面提供了自由度
成员函数和友元函数具有同等的特权
– 主要的区别:
友元函数的调用方式类似于 func(xobject),
而成员函数的调用方式类似于
object.func( )
– 设计者可以选择最有可读性的语法
10
缺点
提高了编程的灵活性,但是违背了面向对象编程的原则
– 在编码中对完整性的破坏可以在一定程度上加以控制
必须在它要访问的类中进行声明。没有源代码是无法完成的
11
友元类 3-1
当一个类的全部或者多数成员函数都必须访问访问另一个类时
声明整个类为另一个类的友元
12
友元类 3-2
#include <iostream.h>
class beta; //前向声明
class alpha {
private:
int a_data;
public:
alpha() { a_data = 10; }
void display(beta);
};
class beta {
private:
int b_data;
public:
beta() { b_data = 20; }
friend void alpha::display(beta bb);
};
类只有在声明之后才能被引用成员函数是友员
13
友元类 3-3
#include <iostream.h>
class beta; //前向声明
class alpha {
private:
int data;
public:
friend class beta; //beta是一个友元类
};
class beta {
public:
void display(alpha d) { //可以访问 alpha
cout << d.data;
}
void get_data(alpha d) { //可以访问 alpha
int x = d.data;
}
};
类只有在声明之后才能被引用
14
操作符重载 2-1
将现有的操作符与一个成员函数相关联并与其类的对象一起使用使下面的操作成为可能
if (obj1 > obj2)
{
//...
}
其中,obj1和 obj2是一个类的对象
15
操作符重载 2-2
编译器通过检查操作数的类型来选择重载操作符
是多态性的一种形式
– 运算多态性
16
注意要点
重载不能改变操作符的基本功能
也不能改变其优先级顺序置
– ++(自增)和 --(自减)只能被用作一元操作符
– 可以使用重载的 + 操作符来对两个对象相乘,
但是这将使得代码难以理解
17
不能被重载的操作符
sizeof( ) 操作符
圆点操作符 (.)
作用域解析操作符 (::)
条件操作符 (?,)
指向成员的指针操作符 (.*)
18
优点
使得程序更容易理解和调试
obj3 = obj1 + obj2;
而不是
obj3.addobjects(obj1,obj2);
19
操作符函数
重载操作符的实际指令
operator关键字
return_type operator op(argument list);
被重载的操作符
20
一元操作符的重载
class temp
{
private,
int x,y;
public,
void operator ++(void);
};
void temp::operator ++(void)
{
x++;
y++;
}
21
二元操作符 的重载
两种方式
– 作为成员函数接受单参数,该参数是这个操作符右边的值
– 作为友员函数接收双参数
22
为字符串类重载 +操作符
String operator +(String s2) //操作符函数
{
String temp; //创建一个临时对象
strcpy(temp.s,s); //复制这个字符串
strcat(temp.s,s2.s); //追加参数字符串
return(temp); //返回临时对象
}
String s1 = "Welcome";
String s2 = "to C++";
String s3;
s3 = s1 + s2;
23
总结
友元函数
友元类
操作符重载