#include "stdafx.h"
#include<iostream>
#include<string.h>
using namespace std; //类的成员函数中,有一些是加了const修饰符的,表示这个函数不会对类的成员进行修改,一些函数的输入参数也加了const修饰,表示该函数不会改变这个参数的值
class String
{
public:
String(const char *str = NULL); //通用构造函数,没值的时候,用NULL默认初始化
String(const String &str); //拷贝构造函数
~String(); //析构函数 String operator+(const String &str)const; //重载+
String& operator=(const String &str); //重载=
String& operator+=(const String &str);
bool operator==(const String &str)const; //重载==
char& operator[](int n)const; //重载[] size_t size()const; //获取长度
const char* c_str()const; //获取C字符串 friend std::istream& operator>>(std::istream&is, String &str); //输入
friend std::ostream& operator<<(std::ostream&os, String &str); //输出 private:
char *data; //字符串
size_t length; //长度
}; String::String(const char *str) // 通用构造函数
{
if (!str)
{
length = 0;
data = new char[1];
*data = '\0';
}
else
{
length = strlen(str);
data = new char[length + 1];
strcpy_s(data, length+1,str);
}
} String::String(const String &str) //拷贝构造函数,要深层复制
{
length = str.size();
data = new char[length + 1];
strcpy_s(data,str.length+1, str.c_str());
} String::~String()
{
delete[] data;
length = 0;
} String String::operator+(String const &str)const
{
String newString;
newString.length = length + str.size();
newString = new char[newString.length + 1];
strcpy_s(newString.data,newString.length+1, data);
strcat_s(newString.data,newString.length+1, str.data);
return newString;
} String& String::operator=(const String &str) //链式赋值,返回引用(对象本身)
{
if (this == &str)
return *this; delete[]data;
length = str.length;
data = new char[length + 1];
strcpy_s(data,length+1, str.data);
return *this;
} String& String::operator+=(const String &str)
{
length += str.length;
char *newData = new char[length + 1];
strcpy_s(newData,length+1, data);
strcat_s(newData,length+1, str.data);
delete[]data;
data = newData;
return *this;
}
inline bool String::operator==(const String&str)const
{
/*if (length != str.length)
return false;*/
return strcmp(data, str.data) ? false : true;
}
inline char& String::operator[](int n)const
{
if (n >= length)
return data[length - 1];
else
return data[n];
}
inline size_t String::size()const
{
return length;
}
//重载输入运算符,先申请一块足够大的内存来存放输入字符串,再进行新的字符串的生成
std::istream& operator>>(std::istream& is, String &str) //为了连续输入,返回引用
{
char tem[100];
is >> tem;
str.length = strlen(tem);
str.data = new char[str.length + 1];
strcpy_s(str.data,str.length+1, tem);
return is;
}
std::ostream&operator<<(std::ostream &os, String &str) //为了连续输出,返回引用(对象本身)
{
os << str.data;
return os;
}
inline const char* String::c_str()const
{
return data;
}
int _tmain(int argc, _TCHAR* argv[])
{
/*String s;
std::cin >> s;
printf("s:is\n%s\ns.size()is\n%d\n",s,s.size());*/ //std::cout << "s:\n" << s<<"\n" << "s.size()\n" << s.size() << std::endl; char a[] = "hello", b[] = "world";
String s1(a), s2(b);
//printf("s1\n%c\ns2\n%c\n", s1, s2);
// std::cout << s1 << "+" << s2 << "=" << s1 + s2 << std::endl; String s3 = s1 + s2;
if (s1 == s3)
cout << "first:s1==s3" << endl;
s1 += s2;
if (s1 == s3)
cout << "second:s1==s3" << endl;
return 0;
}

参看:https://www.cnblogs.com/zhizhan/p/4876093.html

构造一个String类的更多相关文章

  1. 关于如何来构造一个String类

    今天帮着一位大二的学弟写了一个String的类,后来一想这个技术点,也许不是什么难点,但是还是简单的记录一些吧! 为那些还在路上爬行的行者,剖析一些基本的实现..... 内容写的过于简单,没有涉及到其 ...

  2. C++自己实现一个String类

    C++自己实现一个String类(构造函数.拷贝构造函数.析构函数和字符串赋值函数) #include <iostream> #include <cstring> using ...

  3. 实现一个string类

    实现要实现:构造,析构,拷贝构造,赋值的功能 1. 提供构造函数 string(), string(const string & str),string(const  char * str), ...

  4. C++学习之路(六):实现一个String类

    直接贴代码吧,这段时间准备面试也正好练习了一下. class String { public: String(const char *str = ""); ~String(void ...

  5. 一个简单实现的string类

    为了复习c++知识,简单的实现一个string类,类名为CMyString 环境说明:windows 7 64位 和 CentOS Linux release 7.6.1810 (Core) 开发工具 ...

  6. 构造和改变一个string的其他方法

    构造一个string的其他方法: 1string s1(cp, n),cp为c风格数组名或一个指向C风格数组的指针,则执行的操作为拷贝从cp开始包括cp在内的接下来n个字符给s1,n的默认值为size ...

  7. C++面试中string类的一种正确写法

    C++ 的一个常见面试题是让你实现一个 String 类,限于时间,不可能要求具备 std::string 的功能,但至少要求能正确管理资源.具体来说: 能像 int 类型那样定义变量,并且支持赋值. ...

  8. (转)C++——std::string类的引用计数

    1.概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里 ...

  9. String类的构造方法(2)

    写了常见的几个而已. 1:new 一个String类的时候系统会自动传一个空构造 public String(); 注意: 当对象初始化是 null时 和 对象是 "" 时,两者是 ...

随机推荐

  1. Pycharm去掉项目所有 # 注释

    通过快捷键ctrl+shift+R 进入 项目全局替换窗口,点击右上角 勾选正则,然后 搜索框输入 (#.*) 即可 ,然后点击 replace all 去掉所有注释

  2. 【转载】 github vue 高星项目

    内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 UI组件 element ★13489 - 饿了么出品的Vue2的web UI工具套件 Vux ★8133 - 基于Vue和 ...

  3. JavaScript数组方法--every、some、fill

    接上一篇,JavaScript数组方法--concat.push,继续其他的数组方法. every:every() 方法测试数组的所有元素是否都通过了指定函数的测试. 先看其使用方法: functio ...

  4. Angular 引入第三方框架方法(如Jquery,Bootstrap)

    1.npm i jquery --save    /    npm i bootstrap --save 2.angular.json 引入路径 3.引入Jquery和Bootstrap的类型描述文件 ...

  5. this 指向详细解析(箭头函数)

    前言 this 指向问题是入坑前端必须了解知识点,现在迎来了ES6时代,因为箭头函数的出现,所以感觉有必要对 this 问题梳理一下,遂有此文 在非箭头函数下, this 指向调用其所在函数的对象,而 ...

  6. VGG19模型训练+读取

    目录 VGG-19模型简单介绍 VGG-19模型文件介绍 分析模型文件 mean值查看 Weight和Bias查看 读取代码 读取模型 训练代码 参考资料 VGG-19的介绍和训练这里不做说明,网上资 ...

  7. MongoDB(3)--Java 操作 MongoDB 的 API

    引入mongoDb 依赖 <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-j ...

  8. tornado框架设置

    路由 import tornado.ioloop #开启循环 让服务器一直等待请求的到来 import tornado.web #框架基本功能封装在此模块 #例子 class MainHendler( ...

  9. mycat数据中间件、nginx

      MyCat & Nginx  课程目标 目标1:理解MyCat分片,能够配置MyCat分片 目标2:掌握Nginx的安装与静态网站部署 目标3:掌握Nginx的静态网站部署 目标4:理解N ...

  10. python docker 多进程提供 稳定tensorflow gpu 线上服务

    尝试了太多的python多进程的服务,在tensorflow 的线上GPU服务中总是不理想.tensorlfow serving docker服务这些也有些不便. 今天抽空给大家分享一个成功的经验.失 ...