## 运算符重载 后
·重载关系运算符,可以让两个自定义类型对象进行对比操作
1.重载运算
–重载 operator
–bool operator == (Person & p)
#include<iostream>
using namespace std;
#include<string>
//重载关系运算符,可以让两个自定义类型对象进行对比操作
class Person
{
public:
Person(string name, int age)
{
this->m_Name = name;
this->m_Age = age;
}
//重载 == 号
bool operator == (Person & p)
{
if(this->m_Name == p.m_Name && this->m_Age ==p.m_Age)
{
return true;
}
else { return false; }
}
string m_Name;
int m_Age;
};
void test01()
{
Person p1("Tom",18);
Person p2("Jerry", 18);
if (p1 == p2)
{
cout << "p1 和 p2 是相等的!" << endl;
}
else
{
cout << "p1和 p2是不相等的!" << endl;
}
}
int main()
{
test01();
system("pause");
return 0;
}
2.函数调用运算符重载
定义:
·函数调用运算符()也可以重载。
·由于重载后使用的方式非常像函数的调用,称为仿函数。
·仿函数没有固定写法,灵活生动。
class MyPrint
{
public:
void operator()(string text) //operator()代表函数名 (string text)形参列表
{
cout << text << endl;
}
};
void test01()
{
//重载的()操作符 也称为仿函数
MyPrint myFunc; //MyPrint myFunc; 调用的是构造函数
myFunc("hello world");//myFunc(参数); 调用的是重载() 仿函数
}
//灵活的仿函数
//加法类
class MyAdd
{
public:
int operator()(int num1, int num2)
{
return num1 + num2;
}
};
void test02()
{
MyAdd myadd;
int ret = myadd(100, 25);
cout << "ret = " << ret<<endl;
//仿函数为面向对象类的
//匿名函数为面向过程
//在对象后加上实参列表就是 对 重载函数的调用
//匿名函数对象 当前行执行完后立马被释放
cout << MyAdd()(100, 25) << endl;
}
3.继承
类与类之间的特别的关系,把代码中重复表达的函数信息用公共的方式进行表达。
特点:减少代码的重复量
定义: class A : public B;
A类称为派生类 或者 子类
B类称为基类 或者 父类
普通实现页面
Java页面
//class Java
//{
//public:
// void header()
// {
// cout << "首页、公开课、登录、注册...(公共头部)" << endl;
// }
// void footer()
// {
// cout << "帮助中心、交流合作、站内地图...(公共底部)" << endl;
// }
// void left()
// {
// cout << "Java、Python、C++、...(公共分类的列表)" << endl;
// }
// void content()
// {
// cout << "Java学科视频" << endl;
// }
//
//};
python的页面
//class Python
//{
//public:
// void header()
// {
// cout << "首页、公开课、登录、注册...(公共头部)" << endl;
// }
// void footer()
// {
// cout << "帮助中心、交流合作、站内地图...(公共底部)" << endl;
// }
// void left()
// {
// cout << "Java、Python、C++、...(公共分类的列表)" << endl;
// }
// void content()
// {
// cout << "Python学科视频" << endl;
// }
//
//};
C++页面
//class VCaddadd
//{
//public:
// void header()
// {
// cout << "首页、公开课、登录、注册...(公共头部)" << endl;
// }
// void footer()
// {
// cout << "帮助中心、交流合作、站内地图...(公共底部)" << endl;
// }
// void left()
// {
// cout << "Java、Python、C++、...(公共分类的列表)" << endl;
// }
// void content()
// {
// cout << "C++学科视频" << endl;
// }
//
//};
//继承页面的实现
//公共页面类
class BasePage
{
public:
void header()
{
cout << "首页、公开课、登录、注册...(公共头部)" << endl;
}
void footer()
{
cout << "帮助中心、交流合作、站内地图...(公共底部)" << endl;
}
void left()
{
cout << "Java、Python、C++、...(公共分类的列表)" << endl;
}
void content()
{
cout << "Java学科视频" << 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 VCaddadd : public BasePage
{
public:
void content()
{
cout << "C++学科视频" << endl;
}
};
派生类中的成员,包含两部分:
·一、从基类中继承过来的;
·二、自己增加的成员。
从基类继承过来的表现其共性,而新增的成员体现其个性。
4.继承方式
定义: class A(子类) : 继承方式 B(父类)
·公共继承 public
·保护继承 protected
·私有继承 private
//公共继承
class Base1
{
public:
int m_A;
protected:
int m_B;
private:
int m_C;
};
class Son1 : public Base1
{
public:
void func()
{
//父类中的公共和保护权限在子类中可以访问
//父类中的私有权限 子类访问不到
m_A = 10;
m_B = 20;
}
}
void test01()
{
Son1 s1;
s1.m_A = 100;
s1.m_B = 25;//到了Son1中的 m_B是保护成员 类外访问不到
}
//保护继承
class Base2
{
public:
int m_A;
protected:
int m_B;
private:
int m_C;
};
class Son2 : public Base2
{
public:
void func()
{//其他权限都变为保护权限
//父类中的私有权限 子类访问不到
m_A = 10;
m_B = 20;
}
}
void test02()
{
Son2 s1;
//s1.m_A = 100;
//s1.m_B = 25;//到了Son2中的m_A和 m_B是保护成员 类外访问不到
}
//私有权限
class Base3
{
public:
int m_A;
protected:
int m_B;
private:
int m_C;
};
class Son3 : public Base3
{
public:
void func()
{
//父类中私有成员访问不到,公共和保护成员变为私有成员。
m_A = 10;
m_B = 20;
}
}
void test03()
{
Son3 s1;
//s1.m_A = 100;
//s1.m_B = 25;//到了Son3中的m_A和 m_B是私有成员 类外访问不到
}
函数外只能定义全局变量或者对象,而不能执行语句及调用函数!!
C++是面向对象的语言,只能在全局函数,或者是类里面写执行代码,这些函数和类里面,都属于非全局;全局则像是using namespce std;
5.继承中的对象模型
从父类中继承的成员属于子类的对象:
//继承中的对象模型
class Base
{
public:
int m_A;
protected:
int m_B;
private:
int m_C; //私有成员被隐藏,但还是会被继承下去 所占用的大小
};
//公共继承
class Son : public Base
{
public:
int m_D;
};
reportSingleClassLayout"类名文件名"
void test01()
{
//父类中所有非静态成员属性都会被子类继承下去
//父类中私有成员属性 是被编译器给隐藏了,访问不到,但是确实被继承下去了
cout << "sizeof Son =" << sizeof(Son) << endl;
}
小Tip:
·1)//利用开发人员命令提示工具查看对象模型
//跳转盘符 X盘 (文件所在磁盘)
//跳转文件路径 cd 具体路径
//查看命令 cl/dl
·2)继承的私有属性是外部不能访问的,但是继承的成员函数可能要用到,所以私有属性一定要继承。