IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++学习笔记(上机7) -> 正文阅读

[C++知识库]C++学习笔记(上机7)

实验目的

掌握C++语言多态性的基本概念

掌握运算符重载函数的声明和定义方法

函数重载

在C++中,用户可以重载函数。这意味着,在同一作用域内,只要函数参数的类型不同,或者参数的个数不同,或者二者兼而有之,两个或者两个以上的函数可以使用相同的函数名。

运算符重载函数重载方法:

? ? ? ?① 类外定义普通函数;

? ? ? ? ②类内定义成员函数;

? ? ? ? ③友元函数;

不能重载的运算符 12345?

.? ? ? ? ? ? ? ???成员访问运算符

.*? ? ? ? ????????成员访问指针运算符

?:? ? ? ? ???????条件运算符

::? ? ? ? ? ? ? ? 作用域运算符

sizeof? ? ? ? 长度运算符

实验内容:

编写一个程序,实现两个复数的乘法。

①类外定义运算符重载函数

#include<iostream>
using namespace std;
class Complex {
public:
	double real;
	double image;
	Complex(double r = 0, double i = 0) {//Complex类的构造函数
		real = r;
		image = i;
	}
};

//运算符重载函数
//“*”为运算符名称
//“(Complex co1, Complex co2)”为对象的数据传递
//“Complex”为函数类型
Complex operator*(Complex co1, Complex co2) {
	Complex temp;
	temp.real = co1.real * co2.real - co1.image * co2.image;
	temp.image = co1.real * co2.image + co1.image * co2.real;
	return temp;
}

int main() {
	Complex com1(1.1, 2.2), com2(3.3, 4.4), total1, total2;
	total1 = operator*(com1, com2);//调用operator函数
	cout << "real1=" << total1.real <<" " << "image1=" << total1.image << endl;
	total2 = com1 * com2;//调用运算符“+”的重载
	cout << "real2=" << total2.real << " " << "image2=" << total2.image << endl;
	return 0;
}

运算结果如下:

系统已定义的运算符"*"不适用于新的自定义数据类型。

改为operator*

运算符重载的函数格式:

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

? ? ? ? 对运算符的重载处理

}

②友元运算符重载函数

#include<iostream>
using namespace std;
class Complex {
private:
	double real;
	double image;
public:
	Complex(double r = 0, double i = 0) {
		real = r;
		image = i;
	}
	void print();
//定义友元函数
	friend Complex operator*(Complex co1, Complex co2);
};
Complex operator*(Complex co1, Complex co2) {
	Complex temp;
	temp.real = co1.real * co2.real - co1.image * co2.image;
	temp.image = co1.real * co2.image + co1.image * co2.real;
	return temp;
}
void Complex::print() {
	cout << "total real=" << real << " " << "total image=" << image << endl;
}
int main() {
	Complex com1(1.1, 2.2), com2(3.3, 4.4), total1;
	total1 = com1 * com2;
	total1.print();
	return 0;
}

运算结果如下:

?有时候需要在类的外部访问类的私有成员or保护成员

需要一种途径,在不放弃成员安全性的基础上,使一个普通函数或者类的成员函数可以访问到封装于某一类中的信息。

在C++中,友元(friend)提供了在类外访问类中任意成员的方法(特权)

friend用于应对编程中一些比较特殊的情况,绝大多数情况下不需要使用,乱使用只会使C++变成C,甚至更糟。

友元函数虽然可以访问类对象的私有成员,但是不是成员函数,因此,在类的外部定义友元函数时,不需要"类名::".

③成员运算符重载函数

#include<iostream>
using namespace std;
class Complex {
private:
	double real;
	double image;
public:
	Complex(double r = 0, double i = 0);
	void print();

//定义类的成员函数
	Complex operator*(Complex c);

};

//第一个Complex为函数类型,第二个complex为类名
Complex::Complex(double r , double i ){
	real = r;
	image = i;
}
Complex Complex::operator*(Complex c) {
	Complex temp;
	temp.real = real * c.real - image * c.image;
	temp.image = real * c.image + image * c.real;
	return temp;
}
void Complex::print() {
	cout << "total real=" << real << " " << "total image=" << image << endl;

}
int main() {
	Complex com1(1.1, 2.2), com2(3.3, 4.4), total1;
	total1 = com1 * com2;
	total1.print();
	return 0;
}

运算结果如下:

?对双目运算符而言,成员运算符重载函数的形参表中仅有一个参数,是运算符的右操作数。

另一个操作数(左操作数)是隐含的this指针,当前对象。


在定义派生类对象时,构造函数的调用顺序如下:

调用基类的构造函数,对基类数据成员初始化。

调用子对象的构造函数,对子对象的数据成员初始化。

调用派生类的构造函数体,对派生类的数据成员初始化

  1. 当基类构造函数不带参数时,派生类不一定需要定义构造函数;然而当基类的构造函数哪怕只带有一个参数,它所有的派生类都必须定义构造函数,甚至所定义的派生类构造函数的函数体可能为空,它仅仅起参数的传递作用。
  2. 若基类使用默认构造函数或不带参数的构造函数,则在派生类中定义构造函数时可略去“:基类构造函数名(参数表)”,此时若派生类也不需要构造函数,则可不定义构造函数。
  3. 如果派生类的基类也是一个派生类,每个派生类只需负责其直接基类数据成员的初始化,依次上溯。

运算符重载的几点说明:

在成员运算符重载函数的形参表中:

如果运算符是单目的,则参数表为空;

如果运算符是双目的,则参数表中有一个操作数。

运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造完成的

运算符重载不改变操作对象的目数

运算符重载不改变优先级

运算符重载函数的参数至少应有一个是类对象(或类的引用)

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-14 15:45:21  更:2021-12-14 15:46:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:34:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码