zoukankan      html  css  js  c++  java
  • string类中运算符重载实现

    C++中预定义的加、减等运算符的操作对象只能是基本的数据类型。如果要在用户自定义的类型对象上应用同样的运算符,就需要通过运算符重载来重新定义其实现,使它能够用于自定义类型执行特定的操作,所以运算符重载的基本要求是要跟应用在基本数据类型上的功能“”看起来“”是一致的。

    运算符重载的实质是函数重载,其定义也于一般函数的定义类似,唯一一点区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。运算符函数定义的一般格式如下:


      <返回值类型> operator <运算符符号>(<参数表>)
    {
         <函数体>
    }


    对比一般函数的定义格式为:

    <返回值类型> <函数名>(<参数表>)
    {
         <函数体>
    }

    把一般函数定义中的“函数名”替换为“operator+运算符”的形式即为运算符的定义。

    对一个自定义类型对象应用操作符运算,我的理解是,相当于对该对象执行操作符重载函数所定义的行为,把重载的运算符操作当成一般函数操作来看待,理解上就会简单很多。

    给出string类的大部分运算符实现,包括string类构造函数,拷贝构造函数实现,运算符“=”、“+”、“+=”、“!=”、“>”、“<”、“<<”、“>>”的实现,其他可参照实现。


    Mystring.h头文件各运算符重载声明:

    #ifndef __Mystring
    #define __Mystring
    #include <iostream>
    
    class Mystring
    {
    public:
    	Mystring(const char *str=NULL);//构造函数
    	Mystring(const Mystring& obj); //拷贝构造函数
    	Mystring operator=(const Mystring &obj);
    	Mystring operator+(const Mystring &obj);
    	Mystring operator+=(const Mystring &obj);
    	bool operator !=(const Mystring &obj);
    	bool operator >(const Mystring &obj);
    	bool operator <(const Mystring &obj);
    
    	friend	std::ostream & operator<<(std::ostream &out,const Mystring &obj);
    	friend	std::istream & operator>>(std::istream &in,Mystring &obj);
    
    	~Mystring();
    
    private:
    	char *pstr;
    
    };
    
    #endif


    Mysring.cpp各运算符重载定义:
    #include "Mystring.h"
    
    using namespace std;
    
    Mystring::Mystring(const char * str)
    {
    	if(NULL==str)
    	{
    		this->pstr=new char[1];
    		pstr[0]='
    ';
    	}
    	else
    	{
    		this->pstr=new char[strlen(str)+1];
    		strcpy(this->pstr,str);
    	}
    }
    
    Mystring::Mystring(const Mystring & obj)
    {
    	this->pstr=new char[strlen(obj.pstr)+1];
    	//实现深拷贝
    	strcpy(this->pstr,obj.pstr);	
    }
    Mystring::~Mystring()
    {
    	delete [] this->pstr;
    	//释放之后把指针指向空,防止后文引用该指针
    	this->pstr=NULL;
    }
    
    Mystring Mystring::operator=(const Mystring &obj)
    {
    	//分配内存空间,记得+1,因为c风格的字符串以'
    '结尾,需要多加一个字符
    	this->pstr=new char[strlen(obj.pstr)+1];
    	strcpy(this->pstr,obj.pstr);
    	return *this;
    }
    
    Mystring Mystring::operator+(const Mystring &obj)
    {
    	Mystring mstr;
    	mstr.pstr=new char[strlen(this->pstr)+strlen(obj.pstr)+1];
    	sprintf(mstr.pstr,"%s%s",this->pstr,obj.pstr);
    	return mstr;
    }
    Mystring Mystring::operator+=(const Mystring &obj)
    {
    	Mystring mstr;
    	mstr.pstr=new char[strlen(this->pstr)+1];
    	strcpy(mstr.pstr,this->pstr);
    	this->pstr=new char[strlen(mstr.pstr)+strlen(obj.pstr)+1];
    	sprintf(this->pstr,"%s%s",mstr.pstr,obj.pstr);
    	return *this;
    }
    
    bool Mystring::operator!=(const Mystring &obj)
    {
    	if(strcmp(this->pstr,obj.pstr)==0)
    	{
    		return false;
    	}
    	else
    	{
    		return true;
    	}
    }
    
    bool Mystring::operator>(const Mystring &obj)
    {
    	if(strcmp(this->pstr,obj.pstr)>0)
    	{
    		return true;
    	}
    	else
    	{
    		return false;
    	}
    }
    
    bool Mystring::operator<(const Mystring &obj)
    {
    	if(strcmp(this->pstr,obj.pstr)<0)
    	{
    		return true;
    	}
    	else
    	{
    		return false;
    	}
    }
    
    ostream & operator<<(ostream &out,const Mystring &obj)
    {
    	out<<obj.pstr;
    	return out;
    }
    
    istream & operator>>(istream &in,Mystring &obj)
    {
    	//分配内存空间
    	obj.pstr=new char[1024];
    	in>>obj.pstr;
    	return in;
    }
    
    


    在main中测试运算符功能:
    #include <iostream>
    #include "Mystring.h"
    using namespace std;
    int main()
    {
    	Mystring str1("abc");
    	cout<<"str1经过初始化之后值为:"<<str1<<endl;
    	Mystring str2;
    	str2=str1;
    	cout<<"str2经过str1初始化之后值为:"<<str2<<endl;
    	Mystring str3;
    	str3=str1+str2;
    	cout<<"str1与str2之和str3为:"<<str3<<endl;
    	cout<<"请输入字符串str4:"<<endl;
    	Mystring str4;
    	cin>>str4;
    	cout<<"你输入的str4为:"<<str4<<endl;
    	if(str3!=str4)
    	{
    		cout<<"str3不等于str4"<<endl;
    	}
    
    	if(str3>str4)
    	{
    		cout<<str3<<"大于"<<str4<<endl;
    
    	}
    	if(str3<str4)
    	{
    		cout<<str3<<"小于"<<str4<<endl;
    	}
    	
    	system("pause");	
    	return 0;
    }


    对str4输入字符串“ABCABC”,运行结果为:



    注意:运算符中比较特殊的是输入输出流操作“<<”和“>>”,只能作为string类的友元(加friend)来实现,不能作为string类的成员函数实现。

  • 相关阅读:
    mysql分页查询优化
    java反射及Method的Invoke方法(转载)
    java需会(转载)
    Java注解(Annotation)原理详解
    深入分析JDK动态代理
    Java并发编程:volatile关键字解析
    安装hadoop
    linux 配置ssh免密登录
    安装Centos 7 并且配置远程登录
    MAC安装VMware fusion
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9412006.html
Copyright © 2011-2022 走看看