C++运算符重载笔记

今天看了c++中的运算符重载,记录一下,以备后面查看:

#include <iostream>
using namespace std;

class F{
	int n;
	int d;
	void reduce(){
		int mcd = maxcd(n < 0 ? -n : n, d);
		if(mcd != 1){
			n /= mcd;
			d /= mcd;
		}
	}

	public:
	F(int n=0, int d=1):n(n), d(d){
		if(d == 0) throw "分母不能为零";
		if(d < 0) {
			this->d = -this->d;
			this->n = -this->n;
		}
		reduce();
		cout << "F(" << n << ‘/‘ << d << ")" << endl;
	}

	static int maxcd(int a, int b){
		if(a == 0) return b;
		return maxcd(b%a, a);
	}

	friend ostream& operator<<(ostream& o, const F& f){
		o << f.n << ‘/‘ << f.d;
		return o;
	}

	friend F operator+(const F& lh, const F& rh){
		return F(lh.n * rh.d + lh.d * rh.n, lh.d * rh.d);
	}

	//成员函数,少一个参数(当前对象作为第一个操作数)
	F operator*(const F& rh)const{
		//匿名对象
		return F(n*rh.n, d*rh.d);
	}	

	friend F operator~(const F& f){
		return F(f.d, f.n);
	}

	bool operator!()const{
		return n==0;
	}
};

int main(){
	F f1;
	F f2(3);
	F f3(6, 12);
	F f4(5, 3);
	F f5(2, 9);
	cout << f3 << ‘,‘ << f4 << endl;
	cout << F::maxcd(392, 856) << endl;
	cout << f3 + f4 << endl;
	cout << f3*f4 << f2 * f3 * f4 << endl;
	cout << "~f3 = " << ~f3 << endl;
	cout << "!f3 = " << !f3 << endl;

	return 0;
}

注意点:

1、匿名对象

2、成员函数和友元函数对运算符重载的区别

3、临时变量只能传给引用常量(const F&),比如f1 + f2 + f3中f1 + f2返回的是一个临时变量

4、友元函数既可以在类内部实现,也可以在类外部实现,不属于类的成员函数

5、const加在方法上则说明该方法内的this指向的对象只能读取不可修改。

时间: 2024-12-15 07:18:41

C++运算符重载笔记的相关文章

C++ Primer笔记12_运算符重载_递增递减运算符_成员访问运算符

1.递增递减运算符 C++语言并不要求递增递减运算符必须是类的成员.但是因为他们改变的正好是所操作对象的状态,所以建议设定为成员函数. 对于递增与递减运算符来说,有前置与后置两个版本,因此,我们应该为类定义两个版本的递增与递减运算符. 问题来了,程序是如何区分前置和后置呢?因为都是++和-- 为了解决这个问题,后置版本的递增递减运算符接受一个额外的(不被使用)int类型的形参.当我们使用后置运算符时,编译器为这个形参提供一个值为0的实参.这个形参唯一的作用就是区分前置和后置运算符函数. 因为不会

c++笔记--关于箭头运算符重载使用

在stl里面,list的迭代器有重载箭头运算符.之前没搞清楚这个有什么用,看了一些资料,加上自己前面一篇笔记. 写了下面测试程序: 1 #include <iostream> 2 #include <queue> 3 #include <climits> 4 #include <algorithm> 5 #include <memory.h> 6 #include <stdio.h> 7 #include <map> 8

初探C++运算符重载学习笔记&lt;1&gt;

运算符重载 含义: 对抽象数据类型也能够直接使用C++提供的运算符 对已有的运算符赋予多重的含义 使同一运算符针对不同的数据类型产生不同的行为 目的: -->扩展C++运算符的适用范围,以用于类所表示的抽象数据类型 -->程序更简洁 -->代码可读性更好 例如complex_a和complex_b是两个复数对象,如果求和,希望能直接写成 complex_a + complex_b  这样的形式. 实质: 函数重载 返回值类型 operator 运算符(参数表) { .... } 在函数编

C++ Primer笔记13_运算符重载_总结

总结: 1.不能重载的运算符: . 和 .* 和 ?: 和 ::  和 sizeof 和 typeid 2.重载运算符有两种基本选择: 类的成员函数或者友元函数, 建议规则如下: 运算符 建议使用 所有一元运算符 成员函数 = () [] -> 必须是成员函数 += -= /= *= ^= &= != %= >>= <<= , 似乎带等号的都在这里了. 成员函数 所有其它二元运算符, 例如: –,+,*,/ 友元函数 3.前几篇中的实例,现在汇总Person类的程序:

初步C++运算符重载学习笔记&amp;lt;3&amp;gt; 增量递减运算符重载

初步C++运算符重载学习笔记<1> 初探C++运算符重载学习笔记<2> 重载为友元函数     增量.减量运算符++(--)分别有两种形式:前自增++i(自减--i).后自增i++(自减i--) 因此当我们重载该运算符时,要重载对应形式的运算符. T & operator ++() // 前自增++i T & operator ++(int) //后自增 i++ 举例: #include <iostream> using namespace std; c

0718-----C++Primer听课笔记----------运算符重载

0.两个要点 a) 一个空类,编译器自动合成默认无参构造函数.析构函数.拷贝构造函数.赋值运算符. b) 在编写类的时候,必须严格区分对象是否可复制. 1.运算符重载之 string类 1.1 运算符重载的几个要点: a) 运算符重载可以有成员函数和友元函数的形式,后者比前者多一个参数. b) =和+=必须重载为成员函数的形式(不太理解原因). c) 输入和输出必须为友元函数的形式.而且输入操作符要考虑输入失败的情况. d) 运算符重载为成员函数的形式,那么该操作符的第一个操作数必然为该类的对象

C++ Primer 学习笔记_27_操作符重载与转换(2)--++/--运算符重载、!运算符重载、赋值运算符重载 、String类([]、 +、 += 运算符重载)、&gt;&gt;和&lt;&lt;运算符重载

C++ Primer 学习笔记_27_操作符重载与转换(2)--++/--运算符重载.!运算符重载.赋值运算符重载 .String类([]. +. += 运算符重载).>>和<<运算符重载 一.++/--运算符重载 1.前置++运算符重载 成员函数的方式重载,原型为: 函数类型 & operator++(); 友元函数的方式重载,原型为: friend 函数类型 & operator++(类类型 &); 2.后置++运算符重载 成员函数的方式重载,原型为:

C++ Primer 学习笔记_28_操作符重载与转换(3)--成员函数的重载、覆盖与隐藏、类型转换运算符、*运算符重载、-&gt;运算符重载

C++ Primer 学习笔记_28_操作符重载与转换(3)--成员函数的重载.覆盖与隐藏.类型转换运算符.*运算符重载.->运算符重载 一.成员函数的重载.覆盖与隐藏 对于类层次的同名成员函数来说,有三种关系:重载.覆盖和隐藏,理清3种关系,有助于写出高质量的代码. 1.成员函数的重载 重载的概念相对简单,只有在同一类定义中的同名成员函数才存在重载关系,主要特点时函数的参数类型和数目有所不同:但不能出现函数参数的个数和类型均相同,仅仅依靠返回值类型不同来区分的函数,这和普通函数的重载是完全一致

C++ Primer Plus学习笔记之运算符重载

C++ Primer Plus学习笔记之运算符重载 1,成员函数和友元函数选择的建议 下面我们先看两个例子: 成员函数重载 #include<iostream> using namespace std; class Complex { public: Complex(double r=0,double i=0) { re=r; im=i; } Complex operator+(const Complex& obj); Complex operator!(); void Display