重载运算符operator + , ++ , 输出ostream

2024-02-25 07:38

本文主要是介绍重载运算符operator + , ++ , 输出ostream,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

   重载运算符operator + 的实现 (实现的是字符串)

#include<iostream>
#include<string.h>
using namespace std;
//程序=算法+数据
//算法+数据==对象
//定义类:某一类事物的抽象(在草稿纸上描述人类)
class String
{
public://构造器String();String(const char*);String(const String& s);//拷贝构造//接口:const char*  c_str()const;short length()const;//求该对象的长度//重载运算符:String operator+(String&);		//s1+s2===>s1.operator+(s2)String operator=(String& r);void show(){cout<<this->str<<endl;}
private:char* str;	
};
//无参构造
String::String()
{cout<<"string()"<<endl;//分配空间,并将首地址存储在str中   new 类(值)this->str=new char('\0');
}
//有参构造
String::String(const char* p)    //用于第一次的初始化,将字符串复制到this->str中.
{cout<<"this=="<<this<<" String(const char*)"<<endl;//分配数组空间: malloc(长度) 结束符'\0'int ilen=strlen(p);this->str=new char[ilen+1];if(NULL!=this->str){memcpy(this->str,p,ilen+1);//sizeof 类型 空间长度;   strlen(元素)}	
}
//拷贝构造
String::String(const String& s)
{cout<<"String(String&)"<<endl;
//浅拷贝 
//	*this=s;
//深拷贝:为指向的内容着想this->str=new char[  s.length() +1 ];if(this->str!=NULL){memcpy(this->str,s.str,s.length()+1);}}
short String::length()const
{int ilen=0;while(this->str!=NULL&&this->str[ilen++]!='\0');return ilen;
}
//返回数组首地址:常方法(只能读取内容,不能修改内容)
const char* String::c_str()const 	 //只读函数:只能读取,不能修改
{//this->str="abc";this->str[0]='1';return this->str;
}
String String::operator+(String& s)
{//实例化对象:有参构造String result;//分配空间   无参if(!result.str)    //如果result.str!=NULL,就释放掉result.str{delete[] result.str;}//分配空间result.str=new char[this->length() +s.length()+1];    //申请空间memcpy(result.str,this->str,this->length());          //将this->str复制给result.strmemcpy(result.str+this->length()-1,s.str,s.length()); //将s.str复制给result.str+this->length()-1  (为什么加this->length(),因为是将s.str复制到result.str的后面,为什么 -1 因为考虑到字符串的末尾 '\0' 的字符)return result;
}
int main()
{
//实例化String s("abcde");//String s1(s);	//拷贝构造String s1("1234");//重载String s2= s+s1;//  s.operator+(s1)s2.show();/*
//	String s("abcd");String s1;	//String s1=s   复制//赋值:将s的内容赋值s1的内容   (要求:s和s1都必须存在)//s1=s;//引用对象//string aaa;//aaa=s;//对象不同s1=String("abcdeef");s1.show();"abcdef";//不会转换为无名对象
*/
}

   重载运算符实现  operator ++ 

        重载输入输出流:
        输出:<<
        输入:>>
        两个标准输出输出流:cout/cin分别是类ostream/istream的对象

#include<iostream>
#include<stdlib.h>
using namespace std;class Time
{
public:friend Time operator++(Time& t);Time(int,int,int);void show();Time operator--();Time operator--(int);
private:int hours;int minute;int second;
};Time::Time(int h,int m,int s):hours(h),minute(m),second(s)
{
}void Time::show()
{cout<<hours<<":"<<minute<<":"<<second<<endl;
}Time operator++(Time& t)
{if(t.second==59){if(t.minute==59 && t.second==59){if(t.hours==23 && t.minute==59 && t.second==59){t.hours=-1;}t.hours++;t.minute=0;}t.second=-1;t.minute++;}t.second++;return t;
}Time Time::operator--()
{cout<<"前自减"<<endl;
}Time Time::operator--(int)
{cout<<"后自减"<<endl;
}//全局函数:后自加  与前自加区别
Time operator++(Time& t,int d)
{cout<<"后自增"<<endl;
}//重载输出cout<<语句的讲解.
/*
//1.返回类型是 void 就不能连续输出 .
void operator<<(ostream& output,Time& t)
{//私有output<<t.hours<<":"<<t.minute<<":"<<t.second;return output;
}operator<<(cout,t1);        //operator<<(cout,1)==  operator<<(void , endl);
cout<<"1"<<"2";  等价于==>   cout<<"1"------->cout<<"2"   就是cout<<"1"返回 "1" 后还返回一个cout,让后面的可以连续输出,所以返回void是不行的所以需要添加 ostream& 的返回类型.
//2.返回类型 ostream& 就可以返回 cout , 后面就可以连续的调用 cout 就可以连续输出.
ostream& operator<<(ostream& output,Time& t)
{//私有output<<t.hours<<":"<<t.minute<<":"<<t.second;return output;    //返回的output就是 cout的别名 "&"   返回的是 ostream& output  而main函数里面使用打印输出时是 : cout<<"xxx"<<"xxx"<<endl;  这个cout就是output的别名.cout<<t1;    //---->调用 operator<<(cout,t1)===cout(cout<<t1)<<endl;    等价于===> cout<<endl;
}operator<<(cout,t1)<<endl;    //这样输出就没有问题了.讲解: 拆分这个 operator<<(cout,t1)<<endl;  从左往右看这里有两个 "<<" 的重载运算符 拆分就是 operator<<(cout,t1)====>cout*/int main()
{Time t1(22,58,56);//ut<<t1<<endl;  //--->调用  operator<<(cout,t1)<<endl;/*t1.show();//operator++(t1);while(1){system("clear");Time r=++t1;r.show();}
*///while();t1.show();Time r=--t1;r.show();//t1.show();//	Time r2=t1++;	//operator++(t1,0)
}

这篇关于重载运算符operator + , ++ , 输出ostream的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/744811

相关文章

使用TomCat,service输出台出现乱码的解决

《使用TomCat,service输出台出现乱码的解决》本文介绍了解决Tomcat服务输出台中文乱码问题的两种方法,第一种方法是修改`logging.properties`文件中的`prefix`和`... 目录使用TomCat,service输出台出现乱码问题1解决方案问题2解决方案总结使用TomCat,

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

Python使用Colorama库美化终端输出的操作示例

《Python使用Colorama库美化终端输出的操作示例》在开发命令行工具或调试程序时,我们可能会希望通过颜色来区分重要信息,比如警告、错误、提示等,而Colorama是一个简单易用的Python库... 目录python Colorama 库详解:终端输出美化的神器1. Colorama 是什么?2.

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

【重学 MySQL】十九、位运算符的使用

【重学 MySQL】十九、位运算符的使用 示例检查权限添加权限移除权限 在 MySQL 中,位运算符允许你直接在整数类型的列或表达式上进行位级操作。这些操作对于处理那些需要在二进制表示上进行直接修改或比较的场景特别有用,比如权限管理、状态标记等。 &(位与) 对两个数的二进制表示进行位与操作。只有两个相应的二进制位都为 1 时,结果的该位才为 1,否则为 0。 |(位

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

如何将一个文件里不包含某个字符的行输出到另一个文件?

第一种: grep -v 'string' filename > newfilenamegrep -v 'string' filename >> newfilename 第二种: sed -n '/string/!'p filename > newfilenamesed -n '/string/!'p filename >> newfilename

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录 在深度学习项目中,目标检测是一项重要的任务。本文将详细介绍如何使用Detectron2进行目标检测模型的复现训练,涵盖训练数据准备、训练命令、训练日志分析、训练指标以及训练输出目录的各个文件及其作用。特别地,我们将演示在训练过程中出现中断后,如何使用 resume 功能继续训练,并将我们复现的模型与Model Zoo中的