构造一个String类
#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类的更多相关文章
- 关于如何来构造一个String类
今天帮着一位大二的学弟写了一个String的类,后来一想这个技术点,也许不是什么难点,但是还是简单的记录一些吧! 为那些还在路上爬行的行者,剖析一些基本的实现..... 内容写的过于简单,没有涉及到其 ...
- C++自己实现一个String类
C++自己实现一个String类(构造函数.拷贝构造函数.析构函数和字符串赋值函数) #include <iostream> #include <cstring> using ...
- 实现一个string类
实现要实现:构造,析构,拷贝构造,赋值的功能 1. 提供构造函数 string(), string(const string & str),string(const char * str), ...
- C++学习之路(六):实现一个String类
直接贴代码吧,这段时间准备面试也正好练习了一下. class String { public: String(const char *str = ""); ~String(void ...
- 一个简单实现的string类
为了复习c++知识,简单的实现一个string类,类名为CMyString 环境说明:windows 7 64位 和 CentOS Linux release 7.6.1810 (Core) 开发工具 ...
- 构造和改变一个string的其他方法
构造一个string的其他方法: 1string s1(cp, n),cp为c风格数组名或一个指向C风格数组的指针,则执行的操作为拷贝从cp开始包括cp在内的接下来n个字符给s1,n的默认值为size ...
- C++面试中string类的一种正确写法
C++ 的一个常见面试题是让你实现一个 String 类,限于时间,不可能要求具备 std::string 的功能,但至少要求能正确管理资源.具体来说: 能像 int 类型那样定义变量,并且支持赋值. ...
- (转)C++——std::string类的引用计数
1.概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里 ...
- String类的构造方法(2)
写了常见的几个而已. 1:new 一个String类的时候系统会自动传一个空构造 public String(); 注意: 当对象初始化是 null时 和 对象是 "" 时,两者是 ...
随机推荐
- Pycharm去掉项目所有 # 注释
通过快捷键ctrl+shift+R 进入 项目全局替换窗口,点击右上角 勾选正则,然后 搜索框输入 (#.*) 即可 ,然后点击 replace all 去掉所有注释
- 【转载】 github vue 高星项目
内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 UI组件 element ★13489 - 饿了么出品的Vue2的web UI工具套件 Vux ★8133 - 基于Vue和 ...
- JavaScript数组方法--every、some、fill
接上一篇,JavaScript数组方法--concat.push,继续其他的数组方法. every:every() 方法测试数组的所有元素是否都通过了指定函数的测试. 先看其使用方法: functio ...
- Angular 引入第三方框架方法(如Jquery,Bootstrap)
1.npm i jquery --save / npm i bootstrap --save 2.angular.json 引入路径 3.引入Jquery和Bootstrap的类型描述文件 ...
- this 指向详细解析(箭头函数)
前言 this 指向问题是入坑前端必须了解知识点,现在迎来了ES6时代,因为箭头函数的出现,所以感觉有必要对 this 问题梳理一下,遂有此文 在非箭头函数下, this 指向调用其所在函数的对象,而 ...
- VGG19模型训练+读取
目录 VGG-19模型简单介绍 VGG-19模型文件介绍 分析模型文件 mean值查看 Weight和Bias查看 读取代码 读取模型 训练代码 参考资料 VGG-19的介绍和训练这里不做说明,网上资 ...
- MongoDB(3)--Java 操作 MongoDB 的 API
引入mongoDb 依赖 <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-j ...
- tornado框架设置
路由 import tornado.ioloop #开启循环 让服务器一直等待请求的到来 import tornado.web #框架基本功能封装在此模块 #例子 class MainHendler( ...
- mycat数据中间件、nginx
MyCat & Nginx 课程目标 目标1:理解MyCat分片,能够配置MyCat分片 目标2:掌握Nginx的安装与静态网站部署 目标3:掌握Nginx的静态网站部署 目标4:理解N ...
- python docker 多进程提供 稳定tensorflow gpu 线上服务
尝试了太多的python多进程的服务,在tensorflow 的线上GPU服务中总是不理想.tensorlfow serving docker服务这些也有些不便. 今天抽空给大家分享一个成功的经验.失 ...