c++实现String类(构造函数,析构函数,复制构造函数,各类运算符重载函数的编写)
来源:互联网 发布:汽车上哪里用单片机 编辑:程序博客网 时间:2024/05/16 18:32
编写类 String 的构造函数,析构函数,复制构造函数
需要重载下面的运算符:
1、<、>、==和!=比较运算符
2、+=连接运算符和赋值运算符
3、<<输出运算符和>>输入运算符
String.h
#ifndef _STRING_H_ #define _STRING_H_ #include <iostream> using namespace std;class String{public:String();//默认构造函数String(int n,char c);//普通构造函数String(const char* source);//普通构造函数String(const String& s);//复制构造函数 ~String();//析构函数 String& operator=(char* s);//重载=,实现字符串赋值String& operator=(const String& s);//重载=,实现对象赋值char& operator[](int i);//重载[],实现数组运算const char& operator[](int i)const;//重载[],实现数组运算(对象为常量)String& operator += (const String& s);//重载+=,实现与对象相加String& operator += (const char* s);//重载+=,实现与字符串相加friend ostream& operator << (ostream &out, String& s);//重载<<,实现输出流friend istream& operator >> (istream &in, String& s);//重载>>,实现输入流friend bool operator < (const String& left, const String& right);//重载<friend bool operator > (const String& left, const String& right);//重载>friend bool operator == (const String& left, const String& right);//重载==friend bool operator != (const String& left, const String& right);//重载!=//char* getData();//获取data指针int length(); //获取字符串长度private:int size; //data表示的字符长度char* data; //指向字符串数据};#endif
String.cpp
#include <iostream> #include <string.h> #include "String.h" using namespace std;String::String(){ //默认构造函数,构造空字符串data = new char[1]; //空字符串只有'\0'一个元素*data = '\0';size = 0;}String::String(int n, char c){ //普通构造函数data = new char[n+1]; //含有N个相同字符的字符串size = n;char* temp = data; //保存datawhile (n--) //做n次赋值 {*temp++ = c;}*temp = '\0';}String::String(const char* source){//普通构造函数if (source ==NULL) //字符串内容与source相同{data = new char[1]; //将data赋为空字符串*data = '\0';size = 0;}else{size = strlen(source); //复制source字符串data = new char[size + 1];strcpy(data, source);}}String::String(const String& s){ //复制构造函数data = new char[s.size + 1]; //字符串内容与对象s的相同strcpy(data, s.data);size = s.size;}String::~String(){//析构函数if (data != NULL) //字符串内容与source相同{delete []data; //data不为空,释放堆内存data = NULL;size = 0;}}String& String::operator=(char* s){//重载=,实现字符串赋值if (data != NULL) {delete[]data; }size = strlen(s);data = new char[size + 1];strcpy(data, s); //复制目标字符串return *this;}String& String::operator=(const String& s){//重载=,实现String对象赋值if (this == &s) //如果对象S就是自己,直接返回*this{return *this;}if (data != NULL) //释放data堆内存{delete[]data;}size = strlen(s.data);data = new char[size + 1]; //分配堆内存strcpy(data, s.data); //复制对象s的字符串成员return *this;}char& String::operator[](int i){//重载[],实现数组运算return data[i]; //取数组下标为i的字符元素}const char& String::operator[](int i)const{//重载[],实现数组运算(对象为常量)return data[i];}String& String::operator += (const String& s){//重载+=,实现与对象相加int len = size + s.size + 1; //连接对象s的字符串成员char *temp = data;data = new char[len]; //申请足够的堆内存来存放连接后的字符串size = len - 1;strcpy(data, temp); //复制原来的字符串strcat(data, s.data); //连接目标对象内的字符串成员delete[] temp;return *this;}String& String::operator += (const char* s){//重载+=,实现与字符串相加if (s == NULL) //连接s字符串{return *this;}int len = size + strlen(s) + 1; char *temp = data;data = new char[len]; //申请足够的堆内存来存放连接后的字符串size = len - 1;strcpy(data, temp); //复制原来的字符串strcat(data, s); //连接目标对象内的字符串成员delete[] temp;return *this;}int String::length(){ //获取字符串长度return size;}ostream& operator << (ostream &out, String& s){//重载<<,实现输出流for (int i = 0; i < s.length();i++) //打印对象s内字符串成员的所有字符元素 { out << s[i]<<" "; //输出字符串中每一个字符元素 } return out;}istream& operator >> (istream &in, String& s){//重载>>,实现输入流char p[50]; in.getline(p, 50); //从输入流接收最多50个字符s = p; //调用赋值函数return in;}bool operator < (const String& left, const String& right){//重载<int i = 0;while (left[i] == right[i] && left[i] !=0&& right[i]!=0){i++;}return left[i] - right[i]<0 ? true : false;}bool operator > (const String& left, const String& right){//重载>int i = 0;while (left[i] == right[i] && left[i] != 0 && right[i] != 0){i++;}return left[i] - right[i] > 0 ? true : false;}bool operator == (const String& left, const String& right){//重载==int i = 0;while (left[i] == right[i] && left[i] != 0 && right[i] != 0){i++;}return left[i] - right[i] == 0 ? true : false;}bool operator != (const String& left, const String& right){//重载!=int i = 0;while (left[i] == right[i] && left[i] != 0 && right[i] != 0){i++;}return left[i] - right[i] != 0 ? true : false;}
Main.cpp
#include <iostream> #include "String.h" using namespace std; int main(void){String str(3,'a'); //普通构造函数测试 String str1(str); //复制构造函数测试String str2("asdf"); //普通构造函数 String str3; //默认构造函数测试 cout << "str:" << str<< endl;cout << "str1:" << str1 << endl;cout << "str2:" << str2 << endl;cout << "str3:" << str3 << endl;str3 = str2; //赋值函数测试cout << "str3:" << str3 << endl;str3 = "12ab"; //赋值函数测试cout << "str3:" << str3 << endl;cout << "str3[2]:" << str3[2] << endl;// []重载函数测试str3 += "111"; // +=重载函数测试cout << "str3:" << str3 << endl;str3 += str1; // +=重载函数测试cout << "str3:" << str3 << endl;cin >> str1; // >>重载函数测试cout << "str1:" << str1 << endl;String t1="1234";String t2 = "1234";String t3 = "12345";String t4 = "12335"; cout << "t1 == t2?" << (t1 == t2) << endl;// ==重载函数测试cout << "t1 < t3?" << (t1 < t3) << endl;// <重载函数测试cout << "t1 > t4?" << (t1> t4) << endl;// >重载函数测试cout << "t1 != t4?" << (t1 != t4) << endl;// !=重载函数测试system("pause");return 0;}
结果:
阅读全文
0 0
- c++实现String类(构造函数,析构函数,复制构造函数,各类运算符重载函数的编写)
- string类的实现(构造函数,析构函数,运算符重载)
- String类的构造函数、析构函数、拷贝构造函数、赋值运算符重载
- 读书笔记:实现string类的构造函数、拷贝构造函数、析构函数、重载运算符=
- 【C++】复制构造函数(拷贝构造函数)和=运算符重载使用的区别
- String的构造函数,析构函数,复制构造函数,赋值运算符
- 实现字符串类String的设计,实现赋值运算符重载函数,默认、一般、拷贝构造函数,析构函数
- String类的简易实现,用到了构造函数、析构函数、重载运算符、拷贝构造函数、友元函数等知识
- 实现string的默认构造函数,拷贝函数,c型字符串参数的构造函数,赋值构造函数,析构函数,重载输出操作符,测试
- 一段代码引起的对C++构造函数、析构函数,复制构造函数,运算符重载的深度理解
- C++:复数类构造函数、拷贝构造、运算符重载、析构函数
- 编写String类的构造函数,析构函数,赋值运算符
- 运算符重载与复制构造函数
- 构造函数,拷贝构造,析构函数,运算符重载。
- c/c++ 构造函数、拷贝构造函数、析构函数和赋值运算符重载
- 编写String类的普通构造函数、拷贝构造函数、析构函数、赋值函数
- 编写类String的构造函数、拷贝构造函数、析构函数、赋值函数
- 编写String类的构造函数、析构函数、拷贝构造函数、赋值函数
- ReactNative进阶---FlatList(一)
- hihocoder#1333 : 平衡树·Splay2(结构体做法)
- loadrunner Web_类函数之web_add_auto_header()
- .Net Core(一)环境搭建与基本使用
- JSTL_C标签库
- c++实现String类(构造函数,析构函数,复制构造函数,各类运算符重载函数的编写)
- 配置git mergetool不产生*.orig文件
- 线程的和并发的路径
- 使用WebService获取第三方服务数据
- vue tab 切换
- 【Java】使用Java实现文件复制
- tensorflow练习10:判断男声女声
- ZOJ Problem Set
- 基于AWS使用深度学习的10个Linux命令