返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++基础知识之运算符重载详解
  • 563
分享到

C++基础知识之运算符重载详解

2024-04-02 19:04:59 563人浏览 泡泡鱼
摘要

目录运算符重载方式一, 使用成员函数重载运算符 需求:把牛肉换猪肉, 羊肉换猪肉方式二, 使用非成员函数【友元函数】重载运算符两种方式的区别两种方式的选择:总结运算符重载 为什么要使

运算符重载

  • 为什么要使用运算符重载

-C/C++的运算符,支持的数据类型,仅限于基本数据类型。

  • 问题:一头牛+一头马 = ?(牛马神兽?)

一个圆 +一个圆 = ? (想要变成一个更大的圆)
一头牛 – 一只羊 = ? (想要变成4只羊,原始的以物易物:1头牛价值5只羊)

  • 解决方案:

使用运算符重载

方式一, 使用成员函数重载运算符 需求:把牛肉换猪肉, 羊肉换猪肉

规则:

一斤牛肉:2斤猪肉

一斤羊肉:3斤猪肉

实现:

牛 + 牛 = ?猪肉

牛 + 羊 = ?猪肉

 Cow类


> Cow.h
#pragma once
class Pork;
class Sheep;	
class Cow{	//牛类
public:
	Cow(int weight = 0);
	//使用运算符重载, 实现 牛肉 + 牛肉 = 猪肉 
	Pork operator+(const Cow& cow);
	//使用运算符重载, 实现 牛肉 + 羊肉 = 猪肉 
	Pork operator+(const Sheep& sheep);
private:
	int weight;	//重量
};
_________________________________________________________________________________________________________________________________
> Cow.cpp
#include "Cow.h"
#include "Pork.h"
#include "Sheep.h"
Cow::Cow(int weight){
	this->weight = weight;
}
//一斤牛肉换两斤猪肉
Pork Cow::operator+(const Cow& cow){	
	return Pork((this->weight + cow.weight) * 2);
}
//一斤牛肉换两斤猪肉, 一斤羊肉换三斤猪肉
Pork Cow::operator+(const Sheep& sheep){
	int tmp = (this->weight * 2) + (sheep.getWeight() * 3);
	return Pork(tmp);
}

 Sheep类


> Sheep.h
#pragma once
//羊类
class Sheep{
public:
	Sheep(int weight = 0);
	int getWeight() const;
private:
	int weight;	//重量
};
_________________________________________________________________________________________________________________________________
> Sheep.cpp
#include "Sheep.h"
Sheep::Sheep(int weight){
	this->weight = weight;
}
int Sheep::getWeight() const{
	return weight;
}

Pork类


> Pork.h
#pragma once
#include <string>
using namespace std;
class Pork{	//猪肉类
public:
	Pork(int weight = 0);
	string description() const;
private:
	int weight;
};
_________________________________________________________________________________________________________________________________
> Pork.cpp
#include <sstream>
#include "Pork.h"
Pork::Pork(int weight){
	this->weight = weight;
}
string Pork::description() const{
	stringstream ret;
	ret << this->weight << "斤";
	return ret.str();
}

main.cpp

#include <iOStream>
#include <windows.h>
#include "Cow.h"
#include "Pork.h"
#include "Sheep.h"
using namespace std;
int main(void) {
	Pork p1;
	Cow c1(100);
	Cow c2(200);
	Sheep s1(100);
	//调用运算符重载 Pork operator+(const Cow& cow);
	p1 = c1 + c2;
	cout << "牛 + 牛 = 猪肉:" << p1.description() << endl;
	//调用运算符重载 Pork operator+(const Sheep& c1);
	p1 = c1 + s1;
	cout << "牛 + 羊 = 猪肉:" << p1.description() << endl;
	//羊+牛会报错, 因为没有定义对应的羊+牛运算符重载
	//p1 = s1 + c1;
	system("pause");
	return 0;
}

方式二, 使用非成员函数【友元函数】重载运算符

实现:

牛 + 牛 = ?猪肉

牛 + 羊 = ?猪肉

 Cow类


> Cow.h
#pragma once
class Pork;
class Sheep;	
class Cow{	//牛类
public:
	Cow(int weight = 0);
	//使用友元运算符重载, 实现 牛肉 + 牛肉 = 猪肉 
	friend Pork operator+(const Cow& c1, const Cow& c2);
	//使用友元运算符重载, 实现 牛肉 + 羊肉 = 猪肉 
	friend Pork operator+(const Cow& c1, const Sheep& s1);
private:
	int weight;	//重量
};
_________________________________________________________________________________________________________________________________
> Cow.cpp
#include "Cow.h"
Cow::Cow(int weight){
	this->weight = weight;
}

 Sheep类


> Sheep.h
#pragma once
//羊类
class Sheep{
public:
	Sheep(int weight = 0);
	int getWeight() const;
private:
	int weight;	//重量
};
_________________________________________________________________________________________________________________________________
> Sheep.cpp
#include "Sheep.h"
Sheep::Sheep(int weight){
	this->weight = weight;
}
int Sheep::getWeight() const{
	return weight;
}

Pork类


> Pork.h
#pragma once
#include <string>
using namespace std;
class Pork{	//猪肉类
public:
	Pork(int weight = 0);
	string description() const;
private:
	int weight;
};
_________________________________________________________________________________________________________________________________
> Pork.cpp
#include <sstream>
#include "Pork.h"
Pork::Pork(int weight){
	this->weight = weight;
}
string Pork::description() const{
	stringstream ret;
	ret << this->weight << "斤";
	return ret.str();
}

main.cpp

#include <iostream>
#include <Windows.h>
#include "Cow.h"
#include "Pork.h"
#include "Sheep.h"
using namespace std;
//要想访问类的私有数据成员, 就把这个函数定义为友元
Pork operator+(const Cow& c1, const Cow& c2) {
	return ((c1.weight + c2.weight) * 2);
}
//要想访问类的私有数据成员, 就把这个函数定义为友元
Pork operator+(const Cow& c1, const Sheep& s1) {
	return((c1.weight * 2) + (s1.getWeight() * 3));
}
int main(void) {
	Pork p1;		
	Cow c1(100);	//100斤的牛
	Cow c2(200);	//200斤的牛
	Sheep s1(100);	//100斤的羊
	//调用 friend Pork operator+(const Cow& c1, const Cow& c2);
	p1 = c1 + c2;
	cout << "使用友元 牛 + 牛 = 猪肉:" << p1.description() << endl;
	//调用 friend Pork operator+(const Cow& c1, const Sheep& s1);
	p1 = c1 + s1;
	cout << "使用友元 牛 + 羊 = 猪肉:" << p1.description() << endl;
	system("pause");
	return 0;
}

两种方式的区别

区别:

使用成员函数来实现运算符重载时,少写一个参数,因为第一个参数就是this指针。

两种方式的选择:

  • 一般情况下,单目运算符重载,使用成员函数进行重载更方便(不用写参数)
  • 一般情况下,双目运算符重载,使用友元函数更直观

方便实现a+b和b+a相同的效果,成员函数方式无法实现。

例如: 100 + cow; 只能通过友元函数来实现

cow +100; 友元函数和成员函数都可以实现

  • 特殊情况:

(1)= () [ ] -> 不能重载为类的友元函数!!!(否则可能和c++的其他规则矛盾),只能使用成员函数形式进行重载。

(2)如果运算符的第一个操作数要求使用隐式类型转换,则必须为友元函数(成员函数方式的第一个参数是this指针)

注意:

同一个运算符重载, 不能同时使用两种方式来重载,会导致编译器不知道选择哪一个(二义性)

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!   

--结束END--

本文标题: C++基础知识之运算符重载详解

本文链接: https://lsjlt.com/news/140157.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++基础知识之运算符重载详解
    目录运算符重载方式一, 使用成员函数重载运算符 需求:把牛肉换猪肉, 羊肉换猪肉方式二, 使用非成员函数【友元函数】重载运算符两种方式的区别两种方式的选择:总结运算符重载 为什么要使...
    99+
    2024-04-02
  • Python编程基础之运算符重载详解
    目录学习目标一、运算符重载(一)概述(二)加法运算重载符1、概述2、案例演示总结学习目标 1.掌握运算符重载 2.会定制对象字符串的形式 一、运算符重载 (一)概述 运算符重载是通过...
    99+
    2024-04-02
  • 聊聊C++ 运算符重载知识
    前言 1.运算符重载是一种形式的C++多态。 2.重载运算符可以使代码看起来更加自然。 回顾类 在正常构造类的时候,有些成员方法可以不用写出来,例如在这样一个表示时间的类中,拷贝构造...
    99+
    2024-04-02
  • C++重载的奥义之运算符重载详解
    目录0、引言1、运算符重载定义2、作为成员函数进行重载3、作为全局函数进行重载4、运算符重载的一些规则0、引言 重载,顾名思义从字面上理解就是重复装载,打一个不恰当的比方,你可以用一...
    99+
    2023-05-16
    C++ 运算符重载 C++ 运算符 C++ 重载
  • C# 基础之运算符
    1、条件运算符 条件运算符(:)也称为三元(目)运算符,是if...else结构的简化形式,可以嵌套使用。 复制代码 代码如下:int x = 1;  strin...
    99+
    2022-11-15
    C# 运算符
  • Java基础之逻辑运算符知识总结
    目录一、前言二、逻辑运算符三、代码四、结果五、练习一、前言 逻辑运算符 左右都是布尔类型的操作数,表达式的结果也是布尔类型 true或false 二、逻辑运算符 &...
    99+
    2024-04-02
  • C++类与对象之运算符重载详解
    目录运算符重载加号运算符重载左移运算符重载递增运算符重载递减运算符重载赋值运算符重载关系运算符重载函数调用运算符重载总结运算符重载 运算符重载概念:对已有的运算符重新进行定义,赋予其...
    99+
    2024-04-02
  • Python 3 之 运算符重载详解
    基础知识实际上,“运算符重载”只是意味着在类方法中拦截内置的操作……当类的实例出现在内置操作中,Python自动调用你的方法,并且你的方法的返回值变成了相应操作的结果。以下是对重载的关键概念的复习:运算符重载让类拦截常规的Python运算。...
    99+
    2023-01-31
    详解 运算符 Python
  • Java基础学习之运算符相关知识总结
    1.算术运算符 +表示加法运算符 -表示减法运算符 *表示乘法运算符 /表示除法运算符 %表示取模/取余运算符 package com...
    99+
    2024-04-02
  • C++运算符重载图文详解
    目录1. 运算符重载1.1 运算符重载为普通函数1.2 运算符重载为成员函数2. 赋值运算符=的重载2.1浅复制与深复制2.2返回值的讨论3. 动态可变长度数组总结1. 运算符重载 ...
    99+
    2024-04-02
  • C++中的运算符重载详解
    目录1、引例2、类中自动建立的函数3、重载赋值运算符解析总结1、引例 class Complex { private: double Real,Image; public: ...
    99+
    2024-04-02
  • Java基础之位运算知识总结
    目录一、位运算的分类与展现效果二、原理三、边界值测试一、位运算的分类与展现效果 java位运算可以分为左移和右移,其中右移还有无符号右移。   java只对整型位移,可...
    99+
    2024-04-02
  • C++基础入门之运算符
    目录1. 算术运算符2. 赋值运算符3. 比较运算符4. 逻辑运算符总结 1. 算术运算符 2. 赋值运算符 3. 比较运算符 4. 逻辑运算符 总结 本篇文章就到这里了,希...
    99+
    2024-04-02
  • C语言操作符基础知识详解
    目录一.单目操作符:二.关系操作符三.条件操作符四.逗号表达式五.逻辑操作符总结一.单目操作符: !:逻辑反操作符; -:负数操作符; +:整数操作符; &:取地址操作符; ...
    99+
    2024-04-02
  • Java基础知识精通各种运算符
    目录前言一、算数运算符1.简介2.运用+-*/%二、自增自减运算符++–三、赋值运算符四、关系运算符五、逻辑运算符&(单与)| (单或)^(异或)!(非)&...
    99+
    2024-04-02
  • C语言入门之基础知识详解
    目录一、思维导图二、环境搭建三、编码规范四、基本数据类型五、分支循环5.1 分支5.2 循环六、break与continue6.1 无限循环一、思维导图 内容不限于此思维导图 二、...
    99+
    2024-04-02
  • C++运算符重载的详细讲解
    加号运算符重载 对于内置数据类型,编译器知道如何运算 但是对于自己封装的类,编译器无法进行运算 这时可以通过自己定义运算符重载进行运算 operator+ 通过成员函数重载+号 ...
    99+
    2024-04-02
  • C++双目运算符+=的重载详解
    目录1、+=重载2、friend重载+=3、运算符3.1 单目运算符3.2 双目运算符3.3 三目运算符4、重载++和重载- -总结1、+=重载 class Complex { ...
    99+
    2024-04-02
  • C语言运算符的重载详解
    目录运算符重载的规则 1. 运算符重载为成员函数2. 运算符重载为非成员函数        ...
    99+
    2024-04-02
  • C++超详细讲解运算符重载
    目录概念赋值运算符重载const成员取地址及const取地址操作符重载概念 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类 型,函数名...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作