1. 程式人生 > >【C++】String類中的運算子過載

【C++】String類中的運算子過載

模組化設計:

標頭檔案:

<span style="font-size:18px;">
#ifndef operator_operator_h
#define operator_operator_h

#include <iostream>  
#include <string>  

using namespace std;

class MyString
{
public:
	//三個過載的建構函式  
	MyString();
	MyString(const char* str);
	MyString(const MyString& str);
	//解構函式  
	~MyString();

	//過載運算子  
	MyString& operator = (const MyString& str);
	char&  operator[](int index);//訪問下標
	friend ostream& operator << (ostream& out, const MyString& str); //過載輸出操作符  
	friend istream& operator >> (istream& in, MyString& str); //過載輸入操作符  
	friend MyString operator + (const MyString& str1, const MyString& str2); //過載加號操作符,注意返回引用不行
	friend MyString operator += (MyString& str1, const MyString& str2); //過載+=操作符  
	friend bool operator == (const MyString& str1, const MyString& str2);   //過載相等操作符  
	friend bool operator != (const MyString& str1, const MyString& str2);   //過載不相等操作符  

private:
	char* p;
	int len;
};



#endif;
</span>

功能函式:

<span style="font-size:18px;">
#include "operator.h"

//預設建構函式,初始化為空串  
MyString::MyString()
{
	len = 0;
	p = new char[len + 1];
	p[0] = '\0';
}

//建構函式,用一個字串初始化  
MyString::MyString(const char* str)
{
	len = strlen(str);
	p = new char[strlen(str) + 1];
	strcpy_s(p, strlen(str) + 1, str);
}

//拷貝建構函式,用另外一個string初始化  
MyString::MyString(const MyString& str)
{
	len = str.len;
	p = new char[strlen(str.p) + 4];
	strcpy_s(p, strlen(str.p) + 1, str.p);
}

//解構函式  
MyString::~MyString()
{
	delete[] p;
}

//過載賦值操作符( = )  
MyString& MyString::operator = (const MyString& str)
{
	if (this->p == str.p)
	{
		return *this;
	}
	delete[] p;
	len = str.len;
	p = new char[len + 1];
	strcpy_s(p, len + 1, str.p);
	return *this;
}

//過載輸出操作符( << )  
ostream& operator << (ostream& out, const MyString& str)
{
	out << str.p;
	return out;
}

//過載輸入操作符( >> )  
istream& operator >> (istream& in, MyString& str)
{
	in >> str.p;
	return in;

}

//過載加號操作符( + )  
MyString operator + (const MyString& str1, const MyString& str2)
{
	MyString str;
	delete[] str.p;
	str.len = str1.len + str2.len;
	str.p = new char[str.len + 1];
	strcpy_s(str.p, str.len + 1, str1.p);
	strcat_s(str.p, str.len + 1, str2.p);
	return str;
}

//過載相加賦值操作符( += )  
MyString operator += (MyString& str1, const MyString& str2)
{
	str1 = str1 + str2;
	return str1;
}

//過載相等操作符  
bool operator == (const MyString& str1, const MyString& str2)
{
	if (strcmp(str1.p, str2.p) == 0)
	{
		return true;
	}
	return false;
}

//過載不相等操作符  
bool operator != (const MyString& str1, const MyString& str2)
{
	if (strcmp(str1.p, str2.p) == 0)
	{
		return false;
	}
	return true;
}


//過載下標([])
char&  MyString::operator[](int index)
{
	return p[index];
}


</span>

測試程式:

<span style="font-size:18px;"> 
#include "operator.h"

int main()
{
	MyString mystr("asfasgdhf");  //測試建構函式,用一個字串初始化  

	cout << mystr[2] << endl;

	mystr[4] = 'd';

	cout << mystr <<endl;

	MyString mystr2(mystr); //用另外一個string初始化  

	cout << mystr2 << endl;

	MyString mystr3;

	mystr3 = mystr + mystr2; //測試加號運算子,測試賦值運算子  

	cout << mystr + mystr2 << endl;

	mystr3 += mystr; //測試+=運算子  

	cout << mystr3 << endl;

	cout << (mystr == mystr2) << endl;  //測試 ==  

	cout << (mystr != mystr3) << endl;  //測試 !=  


	MyString mystr4;

	cout << "Input a series characters, end of ctrl+z." << endl;

	cin >> mystr4;    //測試過載的輸入符號( >> )  

	cout << mystr4 << endl;

	return 0;
}
</span>

執行結果:


相關推薦

C++String運算子過載

模組化設計: 標頭檔案: <span style="font-size:18px;">#ifndef operator_operator_h #define operator_op

c++為什麼靜態(static)成員不能在的定義內初始化?

先看一段程式碼: #include <iostream> using std::cout; //class class loopsaker { public: static int a=1; // 錯誤! loopsaker(); }; int ma

string運算子過載的實現

#include<iostream> using namespace std; class MyString { public: MyString(); MyString(const int number); MyStri

C++第九周實驗報告3-1》----接第8周任務3,定義分數運算子過載,實現分數的輸入輸出

/* (程式頭部註釋開始) * 程式的版權和版本宣告部分 * Copyright (c) 2011, 煙臺大學計算機學院學生 * All rights reserved. * 檔名稱: CFraction.cpp *

C++String拷貝(包含深拷貝淺拷貝)以及拷貝建構函式幾種呼叫的情況

之前我們已經講過了類和物件,但是其中我們沒有仔細的分析建構函式以及拷貝建構函式。 現在我們仔細的來分析一下這兩類函式。 **建構函式** 在寫建構函式時,必要情況下我們要給一些值進行初始化,不然在執行時可能會出現無法預知的錯誤 初始化也分

javaString的基本方法

lastindex bool bsp sta substr 方法 相等 當前 start Java的String類基本方法 一、構造函數 函數 返回值 作用 String(byte[] bytes) String 通過byte數組構造字符串對象 String(

JavaThread的join()方法原理

簡介 join()是Thread類的一個方法。根據jdk文件的定義: public final void join()throws InterruptedException: Waits for this thread to die. join()方法的作用,是

C++String常用

1.string類的建構函式: string(const char *s); //用c字串s初始化 string(int n,char c); //用n個字元c初始化 此外,string類還支援預設建構函式和複製建構函式,如string s1;string s2=

C++string::npos

一、關於npos的定義 在MSDN中有如下說明: basic_string::npos static const size_type npos = -1;//定義 The constant is the&nb

pythonsuper()和__init__()的區別

【轉】python類中super()和__init__()的區別 單繼承時super()和__init__()實現的功能是類似的 class Base(object): def __init__(self): print 'Base create' class child

C++初學和物件的概念

C++中的類Class可以看作C語言中結構體的升級版。結構體是一種構造型別,它可以包含若干成員變數,而其中每個成員變數的型別又可以不同。例如: struct Student {//結構體包含的成員變數 char *name; int age; float score; }; void D

C#及其方法

#一、類 ##1、什麼是類   在面嚮物件語言的結構化設計中,我們把那些看得見、摸得著、具體的、特指的事物稱作是物件,而類則是對物件的一個抽象化是一個模子,確定物件的型別,確定物件將會擁有的特徵(屬性)和行為(方法)。   類不佔用記憶體,物件佔用記憶體。 //類的宣告 //訪問引數

JavaString擴充套件功能實現

//String類擴充套件功能實現 public class Strings{ /** * 重複某個字元 * * 例如: * 'a' 5 => "aaaaa" * 'a' -1 => "" *

C++ 刪除vector重複元素

程式碼: vector<int> v={1,2,4,3,5.2}; sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end()); 解釋: unique函式是一個去重函式,去

C#判斷字串是否包含指定字串,contains與indexof方法效率問題

1 class Program 2 { 3 private const int N = 10000000; 4 private static Stopwatch watch = new Stopwatch(); 5 static v

C#— 基礎函式、運算子和表示式

從前人(學習完這個專案的人)那裡聽說傳智播客是北京最大計算機培訓班黑馬的前身,感覺對他的興趣又深了。只要對它有了興趣自然學的就會快了。看C#視訊有一段時間了,小楊老師講課很有意思,一點也不枯燥,幽默風趣還有一點點自戀哈哈哈,好像他快禿頂了。 對於C#視訊就像是我才來提高班學

C++日期Date的定義

一、類的描述  類描述了具有共同特徵的一組物件,這組物件的屬性和行為相同,只不過具體物件的屬性值等有所區別。C++中類的定義一般分為類的說明部分和類的實現部分。其中類說明的格式如下: class<ClassName> { private: 私有資料和函

C++找陣列唯一出現兩次的數

題:假設你有一個用1001個整陣列成的陣列,這些整數是任意排列的,但是你知道所有的整數都在1到1000(包括1000)之間。此外,除一個數字出現兩次外,其他所有數字只出現一次。假設你只能對這個陣列

C++ string學習筆記1——定義和初始化string物件

string學習筆記1 c++初始化string物件的方式有以下幾種常見的方式。 /**定義和初始化string**/ string s1; ///預設的初始化,s1為一個空字串。 string s2 = s1;

JavaSEString擴充套件功能實現

重複某個字元 //String類擴充套件功能實現 public class Strings{ /** * 重複某個字元 * * 例如: * 'a'