C/C++学习笔记:String类的构造函数、析构函数和赋值函数
来源:互联网 发布:淘宝助理本地库存宝贝 编辑:程序博客网 时间:2024/04/28 21:48
已知:String 类
class String
{
public:
String(const char *str = NULL); // 通用构造函数
String(const String &another); // 拷贝构造函数
~ String(); // 析构函数
String& operator=(const String &rhs); // 赋值函数
private:
char *m_data; // 用于保存字符串
};
#include <iostream>class String{public:String (const char *str = NULL); //通用构造函数String (const String &another); //拷贝构造函数~String(); //析构函数String& operator = (const String &rhs); //赋值函数protected:private:char *m_data; //用于保存字符串};String::String(const char *str){if ( NULL == str){m_data = new char[1]; ////对空字符串自动申请存放结束标志'\0'的空间if ( NULL == m_data ) //内存是否申请成功{std::cout << "Application of memory failure" << std::endl;exit(1);}m_data[0] = '\0';}else{int length = strlen(str);m_data = new char[length + 1];if (NULL == m_data){std::cout << "Application of memory failure" << std::endl;exit(1);}strcpy(m_data, str);}}String::String(const String &another) //输入参数为const型 {int length = strlen(another.m_data);m_data = new char[length + 1];if (NULL == m_data){std::cout << "Application of memory failure" << std::endl;exit(1);}strcpy(m_data, another.m_data);}//析构函数String::~String(){delete [] m_data;}String& String::operator=(const String &rhs) //输入参数为const型 {if ( this == &rhs ) //检查自赋值 { return *this;}int length = strlen(rhs.m_data);delete [] m_data;//释放原来的内存资源m_data = new char[length+1];if (NULL == m_data){std::cout << "Application of memory failure" << std::endl;exit(1);}strcpy(m_data, rhs.m_data);return *this; //返回本对象的引用}// 测试void main(){String A;String B("CSDN");system("pause");}
引申:用C++实现一个String类,它具有比较,连接,输入,输出功能,并且提供一些测试用例。
//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& operator= (char* s); //重载=,实现字符串赋值String& operator= (const String& s); //重载=,实现对象赋值~String(); //析构函数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; //长度char* data; //指向字符串数据};#endif
//String.cpp#include "String.h"String::String(){data = new char[1];*data = '\0';size = 0;}String::String(int n, char c){data = new char[n + 1];size = n;char* tmp = data;while( n -- ){*tmp++ = c;}*tmp = '\0';}String::String(const char* source){if( NULL == source){data = new char[1];*data = '\0';size = 0;}else{size = strlen(source);data = new char[size + 1];strcpy(data, source);}}String::String(const String& s){data = new char[s.size + 1];strcpy(data, s.data);size = s.size;}String& String::operator=(char* s){if (NULL != data){delete [] data;}size = strlen(s);data = new char[size + 1];strcpy(data, s);return *this;}String& String::operator=(const String& s){if( this == &s ){return *this;}if(NULL != data){delete[] data;}size = strlen(s.data);data = new char[size + 1];strcpy(data, s.data);return *this;}String::~String(){if( NULL != data){delete[] data;data = NULL;size = 0;}}char& String::operator[](int i){return data[i];}const char& String::operator[](int i) const{return data[i];}String& String::operator+=(const String& s){int len = size + s.size +1;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( 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){ out << s[i] << " ";}return out;}istream& operator>>(istream& in, String& s){char p[50];in.getline(p,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;}
0 0
- C/C++学习笔记:String类的构造函数、析构函数和赋值函数
- 【C/C++】实现一个string类的构造函数、析构函数和赋值函数
- C/C++面试题:编写类String的构造函数、析构函数和赋值函数。
- c/c++整理--类String的构造函数、析构函数和赋值函数
- c/c++整理--类String的构造函数、析构函数和赋值函数
- string类的构造函数,析构函数,拷贝构造函数和赋值构造函数
- String 的构造函数、析构函数和赋值函数
- string的构造函数,析构函数和赋值函数
- string类的构造函数,拷贝构造函数,析构函数和赋值函数
- String类的构造函数,析构函数,拷贝构造函数和赋值函数
- string类的构造函数,拷贝构造函数,析构函数和赋值函数
- 编写类String的构造函数、拷贝构造函数、析构函数和赋值函数
- string类的构造函数、析构函数、拷贝构造函数和赋值函数
- 编写类String 的构造函数、拷贝构造函数、析构函数和赋值函数
- 写String类的普通构造函数,析构函数,拷贝构造函数和赋值函数
- 类String的构造函数,析构函数,赋值函数
- String的构造函数、析构函数和赋值数
- 网易游戏笔试题:编写string类的构造函数、拷贝构造函数、赋值构造函数和析构函数
- object-c中NSString的常见操作
- 第25周工作计划表
- 每日linux命令学习之top
- Hadoop1完全分布式安装
- struts2的整体回顾(ACTION、拦截器、值栈、OGNL表达式、ModelDriven方案等)
- C/C++学习笔记:String类的构造函数、析构函数和赋值函数
- kali64位安装ferret
- HDU 3516 Tree Construction (四边形不等式优化DP)
- UVaOJ-11488-Hyper Prefix Sets 解题报告
- linux usb枚举过程分析之守护进程及其唤醒
- Linux 内核学习
- 浅析线程基本使用
- equals和==的区别
- 开坑!JavaScript AMD模块的设计与实现