常用的過載運算子你瞭解幾個?
知識點介紹
運算子過載,就是對已有的運算子重新進行定義,賦予其另一種功能,以適應不同的資料型別運算子過載的目的:簡化操作 讓已有的運算子 適應適應不同的資料型別。
簡單的介紹一下,接下來酒肉伺候~
由於比較多,故分檔案來實現
mystring.h
#ifndef MYSTRING_H
#define MYSTRING_H
#include<iostream>
using namespace std;
class myString
{
//過載<<運算子
friend ostream &operator <<(ostream &out,myString &ob);
//過載>>運算子
friend istream &operator >>(istream &in,myString &ob);
private:
char *str;
int size;
public:
myString();//無參建構函式
myString(char *str);//有參建構函式
myString(const myString &ob);//複製建構函式
~myString();//解構函式
int size1(void);//返回size大小
//過載[]運算子
char &operator [](int index);
//過載=運算子
myString &operator =(const myString &ob);
//實現物件和字串的直接=運算
myString &operator =(const char *str);
//過載+運算子
myString &operator +(const myString &ob);
//實現物件和字串的直接+運算
myString &operator +(const char *str);
//過載==運算子
bool operator ==(const myString &ob);
//實現物件和字串的直接==運算
bool operator ==(const char *str);
};
#endif // MYSTRING_H
mystring.cpp
#include "mystring.h"
#include<iostream>
#include<string.h>
using namespace std;
//無參建構函式
myString::myString()
{
str=NULL;
size=0;
cout<<"無參構造"<<endl;
}
//有參建構函式
myString::myString(char *str)
{
cout<<"有參構造"<<endl;
this->str=new char [strlen(str)+1];
strcpy(this->str,str);
size=strlen(str);
}
//複製建構函式
myString::myString(const myString &ob)
{
//清空str的原有內容,防止記憶體洩漏
if(this->str!=NULL)
{
delete [] str;
this->str=NULL;
}
this->str=new char [strlen(ob.str)+1];
strcpy(this->str,ob.str);
size=ob.size;
}
//解構函式
myString::~myString()
{
if(str!=NULL)
{
delete [] str;
this->str=NULL;
}
}
//返回size大小
int myString::size1()
{
return size;
}
//過載[]運算子
char &myString::operator [](int index)
{
//判斷size大小是否合理
if(index>0 && index<size)
{
return str[index];
}
else
{
cout<<"無效的index"<<endl;
}
}
/過載=運算子
myString &myString::operator =(const myString &ob)
{
//清空str的原有內容,防止記憶體洩漏
if(str!=NULL)
{
delete [] str;
str=NULL;
}
str=new char[ob.size+1];
strcpy(str,ob.str);
size=ob.size;
return *this;//返回當前引用物件
}
//實現物件和字串的直接=運算
myString &myString::operator =(const char *str)
{
if(this->str!=NULL)
{
delete [] this->str;
this->str=NULL;
}
this->str=new char[strlen(str)+1];
strcpy(this->str,str);
size=strlen(str);
return *this;
}
//過載+運算子
myString & myString::operator +(const myString &ob)
{
char* tmp_str=new char[ob.size+size+1];
memset(tmp_str,0,ob.size+size+1);
strcpy(tmp_str,str);
strcat(tmp_str,ob.str);
//tmp為區域性變數,僅在當前大括號有效,加static使其成為靜態區域性變數 防止其釋放
static myString tmp(tmp_str);
return tmp;
}
//實現物件和字串的直接+運算
myString &myString::operator +(const char *str)
{
char* tmp_str=new char[strlen(str)+size+1];
memset(tmp_str,0,strlen(str)+size+1);
strcpy(tmp_str,this->str);
strcat(tmp_str,str);
static myString tmp(tmp_str);
return tmp;
}
//過載==運算子
//返回值bool型別,if判斷語句需要
bool myString::operator ==(const myString &ob)
{
if(strcmp(str,ob.str)==0)
return true;
else
return false;
}
歐元符號
http://www.gendan5.com/currency/EUR.html
//實現物件和字串的直接+運算
bool myString::operator ==(const char *str)
{
if(strcmp(this->str,str)==0)
return true;
else
return false;
}
//過載<<運算子
ostream &operator <<(ostream &out, myString &ob)
{
out<<ob.str;
return out;
}
//過載>>運算子
istream &operator >>(istream &in,myString &ob)
{
cout<<"請輸入要輸入的字串:";
if(ob.str!=NULL)
{
delete [] ob.str;
ob.str=NULL;
}
char buf[1024];
in>>buf;
ob.str=new char[strlen(buf)+1];
strcpy(ob.str,buf);
ob.size=strlen(buf);
return in;
}
main.cpp
#include <iostream>
#include<mystring.h>
using namespace std;
int main(int argc, char *argv[])
{
myString ob1("lucy");
cout<<ob1<<endl;
cout<<"size="<<ob1.size1()<<endl;
cin>>ob1;
cout<<ob1<<endl;
cout<<"size="<<ob1.size1()<<endl;
ob1[1]='E';
cout<<ob1<<endl;
myString ob2=ob1;
cout<<ob2<<endl;
cout<<"size="<<ob2.size1()<<endl;
myString ob3=ob2;
cout<<ob3<<endl;
cout<<"size="<<ob3.size1()<<endl;
myString ob4="hello ob4";
cout<<ob4<<endl;
cout<<"size="<<ob4.size1()<<endl;
myString ob5("我愛美女");
myString ob6("美女愛我");
cout<<ob5+ob6<<endl;
cout<<ob5+"hello ob5"<<endl;
myString ob7("hehe");
myString ob8("haha");
if(ob7==ob8)
{
cout<<"相等"<<endl;
}
else
{
cout<<"不相等"<<endl;
}
if(ob7=="hehe")
{
cout<<"相等"<<endl;
}
else
{
cout<<"不相等"<<endl;
}
return 0;
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2682716/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 瞭解下C# 運算子過載C#
- 你真的瞭解js運算子嗎JS
- 過載運算子
- 運算子過載
- 過載運算子、解構函式函式
- C++運算子過載詳解C++
- [Lang] 運算子過載
- Python 運算子過載Python
- C++——運算子過載C++
- C++運算子過載C++
- python之運算子過載Python
- C++ 運算子過載C++
- 過載運算子的常見方法
- C++中運算子的過載C++
- C++過載的奧義之運算子過載C++
- Javascript需要注意的幾個運算子JavaScript
- Javascript實現運算子過載JavaScript
- 指標運算子過載(* 和 ->)指標
- C++ 過載運算子和過載函式C++函式
- 幾個優雅的JavaScript運算子使用技巧JavaScript
- 盤點Linux運維最常用的命令,你瞭解嗎?Linux運維
- 瞭解React Hooks及其常用的幾個鉤子函式ReactHook函式
- 深入C++05:運算子過載C++
- 重拾Kotlin(18)-運算子過載Kotlin
- 【python隨筆】之【運算子過載】Python
- C++11運算子過載詳解與向量類過載例項(<<,>>,+,-,*等)C++
- Spring MVC常用註解,你會幾個?SpringMVC
- 教你快速理解C++中的運算子過載C++
- C++運算子過載的一些困惑C++
- 瞭解下C# 運算子C#
- 常用的Python機器學習庫合集,你用過幾個?Python機器學習
- 最常用的分散式ID解決方案,你知道幾個分散式
- 開心檔之C++ 過載運算子和過載函式C++函式
- Go語言常用的運算子篇Go
- 一些常用的 Scala 運算子
- Python機器學習常用庫,你用過哪幾個?Python機器學習
- 手寫程式語言-實現運算子過載
- C#運算子過載---逐步地分析與理解C#