C++笔记④运算符重载

44 阅读4分钟

一、运算符重载

(一)定义

方法:定义重载运算符的函数
实质:函数的重载
格式:TYPE operator@(形参表){//重新定义运算符@的功能}
普通的复数相加写法:

#include <iostream>
using namespace std;

class Complex {
	private:
		double r;//实部
		double i;//虚部 
	public:
		Complex(double x= 0.0, double y = 0.0) {
			r = x;
			i = y;
		} 
		Complex Add(const Complex &c);
		void print();
}; 
Complex Complex::Add(const Complex &c) {
	Complex t;
	t.r = r + c.r;
	t.i = i + c.i;
	return t;
}
void Complex::print() {
	cout<<"("<<r<<","<<i<<"i)"<<endl; 
}

int main() {
	Complex a(3.0, 4.0), b(10.5, 20.5), c, d, e;
	c = a.Add(b);
	c.print(); 
	return 0;
}
//output:(13.5,24.5i)

运算符重载写法:

#include <iostream>
using namespace std;

class Complex {
	public:
		double r;//实部
		double i;//虚部 
		void Print();
		Complex(double x = 0.0, double y = 0.0) {//构造函数 
			r = x;
			i = y;
		}
}; 
Complex operator+(Complex &c1, Complex &c2) {
	Complex t;
	t.r = c1.r + c2.r;
	t.i = c1.i + c2.i;
	return t;
}
void Complex::Print() {
	cout<<"("<<r<<","<<i<<"i)"<<endl;
}
int main() {
	Complex a(3.0, 4.0), b(10.5, 20.5), c;
	c = a + b;
	cout<<"c:";
	c.Print(); 
}
//输出:c:(13.5,24.5i) 

(二)重载方法1——重载为类的成员函数

#include <iostream>
using namespace std;

class Complex {
	private:
		double r;//实部
		double i;//虚部 
	public:
		Complex operator+(const Complex &c);
		Complex operator+(double d);
		Complex(double x = 0.0, double y = 0.0) {//构造函数 
			r = x;
			i = y;
		}
		void print();
}; 
Complex Complex::operator+(const Complex &c) {
	Complex t;
	t.r = r + c.r;
	t.i = i + c.i;
	return t;
}
Complex Complex::operator+(double d) {
	Complex t;
	t.r = r + d;
	t.i = i;
	return t;
}
void Complex::print() {
	cout<<"("<<r<<","<<i<<"i)"<<endl;
}
int main() {
	Complex a(3.0, 4.0), b(10.5, 20.5), c, d, e;
	//运用重载的运算符+ 
	d = a + b;
	//e = a +10.5;//不能处理这句 
	d = a.operator + (b);
	e = a.operator + (10.5);
	
	d.print(); //(13.5,24.5i)
	e.print(); //(13.5,4i)
	return 0; 
}

(三)重载方法2——重载为类的友元函数

定义:friend TYPE operator@(形参表);

#include <iostream>
using namespace std;

class Complex {
	private:
		double r;//实部
		double i;//虚部 
	public:
		friend Complex operator+(double d, const Complex &c);
		Complex(double x = 0.0, double y = 0.0) {//构造函数 
			r = x;
			i = y;
		}
		void print();
}; 

Complex operator+(double d, const Complex &c) {
	Complex t;
	t.r = d + c.r;
	t.i = c.i;
	return t;
}
void Complex::print() {
	cout<<"("<<r<<","<<i<<"i)"<<endl;
}

int main() {
	Complex a(3.0, 4.0), b(10.5, 20.5), c, d, e;

	//d = a + b;//不能处理这句 
	e = 10.5 + a;//注意两个参数顺序不可反 
	//d =  (b) + a.operator;//不能处理这句 
	//d = (10.5) + a.operator;//不能处理,operator+ 是一个重载的运算符函数,不需要像成员函数那样使用点操作符进行调用 
	
	e.print(); //(13.5,4i)
	return 0;
}

(四)规则

  • 不能定义新的运算符
  • 下面的运算符不可重载:.、.*、::、?:、sizeof、
  • 运算符的重载既不会改变原运算符的优先级和结合性,也不会改变使用运算符的语法和参数个数
  • 重载运算符的函数不能包含有默认值的参数
  • 重载的运算符必须与自定义类型的对象一起使用,要求其参数至少有一个是自定义类型的对象
  • “=”和“&”不必用户重载。系统已为“=”提供默认的重载函数——实现对象间的浅拷贝,“&”获得对象
  • 当重载为类的成员函数时,运算符重载函数的形参个数要比运算符操作数个数少一个;若重载为友元函数,则参数个数与操作数个数相同
  • 只能通过成员函数重载的运算符:=、()、[]、-> 1717924706483.png

案例分析没看

二、数据类型转换

(一)分类

  1. 隐式(自动)类型转换 例234+5.6
  2. 显式(强制)类型转换 类型名(数据)(类型名)数据
  3. 自定义类型转换:①转换构造函数②运算符重载

(二)转换构造函数类型转换

具有带一个参数的调用形式的构造函数,把参数值(指定类型的数据)转换为类对象

#include <iostream>
using namespace std;

class Complex {
	private:
		double r;//实部
		double i;//虚部 
	public:
		Complex() {
			r = i = 0.0;
		}
		Complex(double d) {
			r = d;
			i = 0.0;
		}
//		Complex(double d1, double d2 = 0.0) {//也可以 
//			r = d1;
//			i = d2;
//		}
		friend Complex operator+(Complex c1, Complex c2);
}; 

Complex operator+(Complex c1, Complex c2) {
	return Complex(c1.r+ c2.r, c1.i+ c2.i);
}

int main() {
	Complex c1 = Complex(1.2);
	c1 = Complex(1.2);
	
	Complex c2 = 5.6;
	c2 = 5.6;
	
	Complex c3;
	c3 = c1 + 5.6;
	c3 = c1 + Complex(5.6);
	c3 = c1 + (Complex)5.6;
	return 0;
}

(三)类型转换函数类型转换(代码没看懂)

将一个类的对象转换成另一种类型的数据,只能是类的成员函数
形式:operator 类型名() { return 返回值}

class Complex {
	operator double() {//将Complex类对象转换为double型数据
		return r;
	}
}; 
void main() {
	Complex c4(1.2, 3.4);
	double d; 
	
	d = c4 + 5.6;//double和Complex类型数据相加 
	d = 5.6 + c4;//不需要定义+运算符的重载函数 
}
//“+”的左侧是double型数据,右侧是Complex类对象
//又无运算符“+”重载函数,不能直接相加
//系统发现有对double的重载函数,因此调用,返回double型数据,然后与2.5相加

**p32-p51没看**

三、标准库之string类

处理字符串的库:string.h或cstring或string类#include<string> dd3101e1747d555217c4e9a0de8ae2d.png 8da83ede8614aaf3bb6a278c5525563.png d1be7ed87a082e98350d1a1ad3fd06c.png