重载关系运算符 继承包括一部分!

本文详细介绍了C++中运算符重载的概念和实践,包括如何重载关系运算符使得自定义类型对象能进行比较操作,以及函数调用运算符的重载——仿函数的运用。此外,还讲解了类的继承机制,通过实例展示了如何通过继承减少代码重复,并探讨了不同继承方式(公共、保护、私有)的特点。最后,讨论了继承中的对象模型和内存布局。
摘要由CSDN通过智能技术生成

## 运算符重载 后
·重载关系运算符,可以让两个自定义类型对象进行对比操作

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)继承的私有属性是外部不能访问的,但是继承的成员函数可能要用到,所以私有属性一定要继承。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值