1.友元
生活中你的假有客厅(public),有你的卧室(private)
客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去
但是呢,你也可以允许你的好朋友进去。
在程序里,一些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术
友元的目的就是让一个函数或者类 访问另一个类中私有成员
友元的关键字为 friend
友元的三种实现
- 全局函数做友元
- 类做友元
- 成员函数做友元
1.全局函数做友元
#include <iostream>
using namespace std;
class room {
//goodfriend全局函数是room好朋友,可以访问room中私有成员
friend void goodfriend(room *room);
public:
room() {
livingroom="客厅";
bedroom="卧室";
}
string livingroom;
private:
string bedroom;
};
//全局函数
void goodfriend(room *room)
{
cout<<"好朋友全局函数 正在访问:"<<room->livingroom<<endl;
cout<<"好朋友全局函数 正在访问:"<<room->bedroom<<endl;
}
int main() {
room room;
goodfriend(&room);
return 0;
}
2.类做友元
2.运算符重载
运算符重载概念:对已有的运算符重新定义,赋予其另一种功能,以适应不同的数据类型
1.加号运算符重载
一个是作为成员函数,接受一个参数;一个是作为非成员函数(友元),接受两个参数。
一般二元操作符定义成友元函数,一元函数定义成类成员函数比较好一点
作用:实现两个自定义数据类型相加的运算
#include <iostream>
using namespace std;
class person {
public:
int a;
int b;
//1.成员函数重载+号
// person operator+(person &p) {
// person temp;
// temp.a=this->a+p.a;
// temp.b=this->b+p.b;
// return temp;
// }
};
//2.全局函数重载+号
person operator+(person p1,person p2)
{
person temp;
temp.a=p1.a+p2.a;
temp.b=p1.b+p2.b;
return temp;
}
int main() {
person p1;
p1.a=10;
p1.b=10;
person p2;
p2.a=10;
p2.b=10;
person p3;
p3=p1+p2;
cout<<p3.a<<endl;
cout<<p3.b<<endl;
return 0;
}
2.左移运算符重载
作用:可以输出自定义数据类型
3.继承
继承是面向对象三大特征之一
1.继承的基本语法
语法:class 子类:继承方式 父类
- 子类 也称为 派生类
- 父类 也称为 基类
#include <iostream>
using namespace std;
//继承实现页面
//公共页面类
class basepage {
public:
void header() {
cout<<"首页、公共课、登录、注册...(公共头部)"<<endl;
}
void footer() {
cout<<"帮助中心、交流合作、站内地图...(公共底部)"<<endl;
}
void left() {
cout<<"JAva、python、C++...(公共分类列表)"<<endl;
}
};
//Java页面
class Java:public basepage {
public:
void content() {
cout<<"Java学科视频"<<endl;
}
};
//python页面
class python:public basepage {
public:
void content() {
cout<<"python学科视频"<<endl;
}
};
//C++页面
class Cpp:public basepage {
public:
void content() {
cout<<"C++学科视频"<<endl;
}
};
void test01() {
cout<<"Java下载视频页面如下:"<<endl;
Java ja;
ja.header();
ja.footer();
ja.left();
ja.content();
cout<<"----------------------"<<endl;
cout<<"python下载视频页面如下:"<<endl;
python py;
py.header();
py.footer();
py.left();
py.content();
cout<<"----------------------"<<endl;
cout<<"C++下载视频页面如下:"<<endl;
Cpp c;
c.header();
c.footer();
c.left();
c.content();
}
int main() {
test01();
return 0;
}
2.继承方式
继承语法一共有三种:
- 公共继承
- 保护继承
- 私有继承
3.继承中的对象模型
问题:从父类继承过来的成员,哪些属于子类对象中?
答:都属于子类对象
4.继承中构造和析构顺序
子类继承父类后,当创建子类对象,也会调用父类的构造函数
继承中的构造和析构顺序如下:
先构造父类,再构造子类,析构的顺序与构造的顺序相反
5.继承同名成员处理方式
问题:当子类与父类出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据呢?
- 访问子类同名成员 直接访问即可
- 访问父类同名成员 需要加作用域 (::)
#include <iostream>
using namespace std;
class base
{
public:
int a=100;
};
class son:public base
{
public:
int a=200;
};
int main ()
{
son s;
cout<<s.a<<endl;
cout<<s.base::a<<endl;
return 0;
}
4.多态
多态是C++面向对象三大特征之一
多态分为两类
- 静态多态:函数重载 和 运算符重载 属于静态多态,复用函数名
- 动态多态:派生类和虚函数实现运行时多态
静态多态和动态动态区别:
- 静态多态的函数地址早绑定 - 编译阶段确定函数地址
- 动态多态的函数地址晚绑定 - 运行阶段确定函数地址