C++ 函数重载、操作符重载

依然是温故而知新,不过现在更多的是以此为乐的心态啦。本篇通过代码实例,展示c++函数重载相关知识,包括构造函数的重载、操作符重载等。
在构造函数重载中,给大家带来点稍微提升的用法, 看了不吃亏,看了不上当
鞭策下面的代码吧,以后在某些场景上SHOW一把时,你可能用的上。

#include <iostream>
#include <assert.h>
#include <sal.h>
#include <string>
#include <vector>using namespace std; 知识点
 do{ statement; }while(0) 经常用在宏定义中,减少一些错误的发生
//
#ifdef MYTRACE()
#else
#define MYTRACE() do { std::cout << __FUNCTION__ << ",line" << __LINE__ << std::endl;}while(0)
#endifclass Student
{
public:/// constructStudent(){MYTRACE();}Student( _In_ const std::string name):m_name(name){MYTRACE();}Student(const std::string name,const int age):m_name(name),m_age(age){MYTRACE();}/// copy constructStudent( _In_ const Student& that){this->m_age = that.m_age;this->m_name = that.m_name;MYTRACE();}/// 拷贝赋值Student& operator=(const Student& that){if(this == &that){return *this;}this->m_age = that.m_age;this->m_name = that.m_name;return *this;}/// 操作符重载friend ostream& operator <<(ostream& out,const Student& that){return out << that.m_name << " is " << that.m_age << " years old.";}bool operator !=(const Student& that){return !(that.age() == this->m_age && that.name() == this->m_name);}bool operator ==(const Student& that){return that.age() == this->m_age && that.name() == this->m_name;}/// 常成员函数const int age() const { return m_age;}const std::string name() const { return m_name;}private:int m_age = 0;std::string m_name;
};

Student 中我们使用了C++中的一些基础知识,只能说中规中矩,平平无奇。

class StudentList
{
public:/*********************construct*******************/StudentList(){}StudentList(std::vector<Student> l):m_sl(l){}StudentList(const Student& t){  m_sl.push_back(t); }StudentList(const Student&& t){ m_sl.push_back(t); }/// 禁用拷贝构造和拷贝赋值StudentList(const StudentList& that) = delete;void operator =(const StudentList& that) = delete;/// 玩点儿高级的:参数列表构造void append(const Student& t){ m_sl.push_back(t); }template <typename ...Args>void append(const Student& t, const Args&... args) {m_sl.push_back(t);append(args...);    // 递归}template <typename ...Args>StudentList(const Student& t,const Args&... args){ append(t,args...);}/// 流式构造StudentList& operator<<(const Student& t) { append(t); return *this; }/*********************construct*******************/const std::vector<Student>& data() const{return m_sl;}/******************************* 操作符重载 ************************/friend ostream& operator <<(ostream& out,const StudentList& that){for (const auto& v : that.data()) { out << "(" << v.name() << "," << v.age() << ")" ; }return out;}const Student& operator []( _In_  const unsigned& index)const {assert(index < m_sl.size());return m_sl[index];}const Student& at(_In_ const unsigned& index) const { return m_sl[index];}bool operator !=(const StudentList& that){if(this == &that){return false;}if(this->data().size() == that.data().size()){for(unsigned i = 0; i < that.data().size();++i){if( const_cast<Student&>(this->data()[i])!=  const_cast<Student&>(that.data()[i])){return true;}}}return true;}bool operator ==(const StudentList& that){return !(const_cast<StudentList&>(that) != const_cast<StudentList&>(*this));}/// 这里不做去重处理StudentList& operator +=(const StudentList& that){for(auto v : that.data()){append(v);}return *this;}/******************************* 操作符重载 ************************/private:std::vector<Student> m_sl;
};

StudentList 类中我们做了一些有意思的尝试,譬如让StudentList支持参数列表的初始化,这让他看起来显然cool了一些,其次我们通过重载 operator << 操作符,增加了支持流式的操作。这类似Qt中的

QStringList() << "wo" << "miss" << "u";

是不是瞬间高大上了一些呢。有点像写文章时堆砌的华丽辞藻?显然不是,一些高级语法的应用,其实只是为了让我们的程序更加优雅,更健壮~

int main()
{/// 测试重载的Student构造函数Student st1;Student st2("LiLei",25);Student st3("Keke",26);/// 测试拷贝构造函数Student st4(st3);std::cout << st4 << std::endl;st4 = st2;std::cout << st4 << std::endl;/// list类型参数 构造函数StudentList sl(std::vector<Student>{st2,st3,st4});std::cout << sl << std::endl;/// 参数列表 递归构造函数StudentList sl1{st2,st3,st4,Student("zhanglu",24)};std::cout << sl1 << std::endl;/// 流式构造StudentList sl2;sl2 << st2 << st3 << st4 << Student("zhaoya",25) << Student("lixiu",25);std::cout << sl2 << std::endl;// 测试使用下标重载函数std::cout << sl2[1] << std::endl;std::cout << sl2.at(0) << "   " << sl2.at(1) << std::endl;// std::cout << sl2[6] << std::endl; // error// 测试 != 和 == 操作符std::string sflag = (sl2 != sl2) ? "true" : "false";std::cout <<  sflag << std::endl;sflag = (sl2 == sl2) ? "true" : "false";std::cout <<  sflag << std::endl;sflag = (sl2 != sl1) ? "true" : "false";std::cout <<  sflag << std::endl;// 测试 "+" 操作符StudentList sl3{Student("xiaoli",25)};sl3 += sl2;std::cout <<  sl3 << std::endl;return 0;
}

ok,有兴趣你也动手试试吧~
每日几行代码 + 一瓶劲酒,祝吾早日登(升)天
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/239168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何快速实现地源热泵远程监控

地源热泵远程监控解决方案 一、项目背景 山东省潍坊市盛世花园小区地源热泵项目是一个先进的供暖与制冷系统&#xff0c;旨在为整个小区提供高效且节能的温控服务。该系统主要由地下管道网络、地源热泵单元以及室内分配系统组成。 针对现有的地源热泵系统的管理和监控问题&a…

110基于matlab的混合方法组合的极限学习机和稀疏表示进行分类

基于matlab的混合方法组合的极限学习机和稀疏表示进行分类。通过将极限学习机&#xff08;ELM&#xff09;和稀疏表示&#xff08;SRC&#xff09;结合到统一框架中&#xff0c;混合分类器具有快速测试&#xff08;ELM的优点&#xff09;的优点&#xff0c;且显示出显着的分类精…

【NAM】《NAM:Normalization-based Attention Module》

NeurIPS-2021 workshop 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics5.2 Experiments 6 Conclusion&#xff08;own&#xff09; 1 Background and Motivation 注意力机制是近些年视觉领域…

WPF组合控件TreeView+DataGrid之DataGrid封装

&#xff08;关注博主后&#xff0c;在“粉丝专栏”&#xff0c;可免费阅读此文&#xff09; wpf的功能非常强大&#xff0c;很多控件都是原生的&#xff0c;但是要使用TreeViewDataGrid的组合&#xff0c;就需要我们自己去封装实现。 我们需要的效果如图所示&#x…

[python]python实现对jenkins 的任务触发

目录 关键词平台说明背景一、安装 python-jenkins 库二、code三、运行 Python 脚本四、注意事项 关键词 python、excel、DBC、jenkins 平台说明 项目Valuepython版本3.6 背景 用python实现对jenkins 的任务触发。 一、安装 python-jenkins 库 pip install python-jenkin…

论文解读:Informer-AAAI2021年最佳论文

论文背景 应用背景 训练的是历史数据&#xff0c;但预测的是未来的数据&#xff0c;但是历史数据和未来数据的分布不一定是一样的&#xff0c;所以时间序列应用于股票预测往往不太稳定 动作预测&#xff1a; 基于之前的视频中每一帧动作&#xff0c;预测下一帧这个人要做什么…

Ubuntu 常用命令之 echo 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 echo 是一个在 Ubuntu 系统下常用的命令&#xff0c;主要用于在终端输出字符串或者变量。 echo 的基本语法 echo [option] [string]echo 命令的参数包括 -n&#xff1a;不输出结尾的换行符。-e&#xff1a;启用反斜杠转义字符。…

超级逼真人脸生成,Stable Diffusion的3个关键技巧

大家好&#xff0c;你是否曾想过&#xff0c;为什么别人可以使用AI图像生成技术生成如此逼真的人脸&#xff0c;而自己的尝试却充满了错误和瑕疵&#xff0c;让人一眼看出是假的。尝试过调整提示和设置&#xff0c;但似乎仍无法与他人的质量相匹配。 本文将带大家了解使用Stab…

LeetCode-17 电话号码的字母组合

LeetCode-17 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;d…

硬件产品经理:硬件产品敏捷开发

目录 简介 敏捷 CSDN学院 作者简介 简介 之所以敏捷产品开发流程会越来越普遍。 主要得益于这个方法可以让企业使用更少的资源去开发出令客户满意的新产品。 敏捷开发强调的最重要的一点就是“快”。 也就是要求通过快速迭代来获取频繁的客户反馈。 这就特别适合应对市…

Python教你如何让代码摆脱死循环的困扰!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在编写Python代码时&#xff0c;无限循环是一个常见的问题&#xff0c;可能导致程序陷入死循环&#xff0c;使得代码无法正常执行。这篇博客将介绍一些方法&#xff0c;帮助大家防止和处理无限循环&#xff0c;确…

ansible变量的使用

本章主要介绍playbook中的变量 自定义变量使用变量文件字典变量列表变量facts变量内置变量变量的过滤器 为了能够写出更实用的playbook&#xff0c;需要在playbook中使用变量。下面来讲解playbook 中常见的变量。本章实验都在/home/lduan/demo2下操作&#xff0c;先把 demo2目…

百度网盘资源下载慢解决方法

1、使用百度网盘客户端&#xff0c;设置使用空闲带宽下载 亲测&#xff0c;可以一定程度上解决下载慢的问题&#xff0c;但是对于有些文件下载还是很慢就不清楚为什么了。 2、使用IDM进行下载 &#xff08;1&#xff09;、第一步下载和安装IDM 搜索后&#xff0c;普通下载后安…

BWS2000倾角传感器c++测试代码【1】

使用瑞芬的倾角传感器配置的时候&#xff0c;数据手册一下就配置好了&#xff0c;但是BWS2000倾角传感器总是出错&#xff0c;这里进行一下记录出现的问题与解决方式。 1.初步测试 在配置BWS2000倾角传感器读取帧数据的时候&#xff0c;总是出现一个问题&#xff0c;就是进行…

Qt/QML编程学习之心得:在QML工程中添加库(十四)

实现库并且使用库&#xff0c;类似于vc中的静态库library、动态库dll、COM组件等方法一样&#xff0c;在Qt中也经常会使用库&#xff0c;或者将部分功能打包成库。 右击Qt项目&#xff0c;点击add library... 在linux中将.a文件导入&#xff0c;工程会自动在.pro温江中增加相应…

关于频谱仪是如何来实现辐射功率测量

1.1 内部基本原理框架 首先是接收到外部信号输入&#xff0c;然后经过可变衰减器衰减&#xff0c;接着进行变频&#xff0c;接着经过带宽带通滤波器进行滤波&#xff0c;滤波后的信号送入检波器进行信号检测&#xff0c;再经对数放大器放大后&#xff0c;送入低通滤波器进行视频…

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据

1.File&#xff08;操作文件本身&#xff09; 1.定义 目录 2.常用方法 3.路径引用符 可以用/或者\\分隔路径 还可以用File.separator分隔路径&#xff0c;会根据不同系统使用啥分隔符。 4.绝对路径、相对路径及桌面路径表示 桌面路径为&#xff1a; 我电脑的用户名为X 5.示例…

解决找不到vcruntime140.dll无法继续执行的多种方法分享

最近&#xff0c;我在使用电脑时遇到了一个问题&#xff0c;即“由于找不到vcruntime140.dll无法继续执行”。vcruntime140.dll是Visual C Redistributable Packages中的一个组件&#xff0c;它是Visual Studio 2015中运行C程序所必需的。如果找不到vcruntime140.dll文件&#…

C++实现增序含头结点的单链例题:现已知单链表L中结点是按整数值递增排列,试写一算法将值为X的结点插入到表L中,使得L任然递增有序

因为比较简单直接给代码&#xff1a; <1>.c文件 #include"Module.h" int main() {int m 0;int flag 0,elect0;printf("*-----------------------------------------------------------------------------------------*\n");struct STU* List Cr…