1 #include<iostream>
2 #include<cstring>
3
4 class String
5 {
6 public:
7 String();
8 String(const char *str);
9 String(const String &rhs);
10 ~String();
11
12 String &operator=(const String &rhs);
13 String operator+(const String &rhs);
14 char operator[](const unsigned int index);
15 bool operator==(const String &rhs);
16 friend std::ostream &operator<<(std::ostream &out, const String &rhs);
17 private:
18 char *m_data;
19 };
20
21 String::String()
22 {
23 std::cout << "default constructor" << std::endl;
24 m_data = new char[1];
25 m_data[0] = '\0';
26 }
27
28 String::String(const char *str)
29 {
30 std::cout << "non-default constructor" << std::endl;
31 if (NULL == str)
32 {
33 m_data = new char[1];
34 m_data[0] = '\0';
35 }
36 else
37 {
38 m_data = new char[strlen(str)+1];
39 strcpy(m_data, str);
40 }
41 }
42
43 String::String(const String &another)
44 {
45 std::cout << "copy constructor" << std::endl;
46 m_data = new char[strlen(another.m_data)+1];
47 strcpy(m_data, another.m_data);
48 }
49
50 bool String::operator==(const String &rhs)
51 {
52 std::cout << "bool == " << std::endl;
53 int result = strcmp(m_data, rhs.m_data);
54 if (0 == result)
55 return true;
56 else
57 return false;
58 }
59
60 String &String::operator=(const String &rhs)
61 {
62 std::cout << "assign constructor" << std::endl;
63 if (this == &rhs)
64 return *this;
65 delete []m_data;
66 m_data = new char[strlen(rhs.m_data)+1];
67 strcpy(m_data, rhs.m_data);
68 return *this;
69 }
70
71 String String::operator+(const String &rhs)
72 {
73 std::cout << "+" << std::endl;
74 String newString;
75 if (NULL == rhs.m_data)
76 newString = *this;
77 else if(NULL == m_data)
78 newString = rhs;
79 else
80 {
81 newString.m_data = new char[strlen(rhs.m_data)+strlen(m_data)+1];
82 strcpy(newString.m_data, m_data);
83 strcat(newString.m_data, rhs.m_data);
84 }
85 return newString;
86 }
87
88 char String::operator[](const unsigned int index)
89 {
90 std::cout << "[]" << std::endl;
91 return m_data[index];
92 }
93
94 std::ostream &operator<<(std::ostream &out, const String &rhs)
95 {
96 out << rhs.m_data;
97 return out;
98 }
99
100 String::~String()
101 {
102 std::cout << "destructor" << std::endl;
103 delete []m_data;
104 }
105
106 int main(void)
107 {
108 const char *p = "hello, world";
109 String s = "hello, world"; // 构造函数隐式转换 调用非默认构造函数
110 String s1(p); // 调用非默认构造函数
111 String s2 = s1; // 调用非默认构造函数
112 String s3; // 调用默认构造函数
113 s3 = s1; // 调用赋值构造函数
114 String s4 = s3 + s1; // 调用+运算符,同时调用默认构造函数
115 bool flag(s1 == s2); // 调用==运算符
116 std::cout << s << std::endl;
117 std::cout << s1 << std::endl;
118 std::cout << s2 << std::endl;
119 std::cout << s3 << std::endl;
120 std::cout << flag << std::endl;
121 char result = s3[1]; // 调用[]运算符
122 std::cout << result << std::endl;
123 std::cout << s4 << std::endl;
124
125 return 0;
126 }

C++实现String类的更多相关文章

  1. 标准库String类

    下面的程序并没有把String类的所有成员方法实现,只参考教程写了大部分重要的成员函数. [cpp] view plain copy #include<iostream> #include ...

  2. 自己实现简单的string类

    1.前言 最近看了下<C++Primer>,觉得受益匪浅.不过纸上得来终觉浅,觉知此事须躬行.今天看了类类型,书中简单实现了String类,自己以前也学过C++,不过说来惭愧,以前都是用C ...

  3. C++ string类的实现

    c++中string类的实现 今天面试被考到了, 全给忘记了!!!   //string类的实现 #include <iostream> #include <string.h> ...

  4. String类的功能

    String类              标红的为较少出现的 1.判断功能 boolean equals(Object obj) :比较字符串内容是否相同,区分大小写 boolean equalsIg ...

  5. java基础复习:final,static,以及String类

    2.final 1)为啥String是final修饰的呢? 自己答: 答案: 主要是为了“效率” 和 “安全性” 的缘故.若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所 ...

  6. String类和StringBuffer类的区别

    首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ...

  7. 05_整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明

    Question: 整理String类的Length().charAt(). getChars().replace(). toUpperCase(). toLowerCase().trim().toC ...

  8. 标准C++中的string类的用法总结

    标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ...

  9. String类常用方法

    1.String类的特点,字符串一旦被初始化就不会被改变. 2.String对象定义的两种方式 ①String s = "affdf";这种定义方式是在字符串常量池中创建一个Str ...

  10. 运用String类实现一个模拟用户登录程序

    package Test; import java.util.Scanner; // 模拟用户登录程序 // 思路: // 1.用两个String类分别接收用户名和密码 // 2.判断输入的用户名和密 ...

随机推荐

  1. docker通过dockerfile构建JDK最小镜像,Docker导出导入镜像

    docker通过dockerfile构建JDK最小镜像,Docker导出导入镜像 一.docker通过dockerfile构建JDK最小镜像 1.1 下载JRE 1.2 解压JRE,删除相关不需要文件 ...

  2. Jenkins (自动使用docker容器发布java.war +tomcat)

    一.大概流程 因为目前没有找Jenkins 和docker 之间比较友好的插件,所以只能使用这种比较low 的方式来实现自动部署了. 1.Jenkins在gitlab拉取项目并编译. 2.将编译后的代 ...

  3. python -m http.server 搭建一个简易web下载服务器

    在打vulnhub靶场的时候遇到的一个问题 目录 一.进到需要发送的安装包目录 二.开启http服务 三.访问服务器 一.进到需要发送的安装包目录 比如设置一个专门发送,传输的文件的文件夹,cmd命令 ...

  4. Linux常用命令详解(第一章)(ls、man、pwd、cd、mkdir、echo、touch、cp、mv、rm、rmdir、)

    本章命令(共11个): 1 2 3 4 5 6 ls man pwd cd mkdir echo touch cp mv rm rmdir 1. " ls " 作用:列出指定目录下 ...

  5. Pytest(13)命令行参数--tb的使用

    前言 pytest 使用命令行执行用例的时候,有些用例执行失败的时候,屏幕上会出现一大堆的报错内容,不方便快速查看是哪些用例失败. --tb=style 参数可以设置报错的时候回溯打印内容,可以设置参 ...

  6. 封装Vue Element的可编辑table表格组件

    前一段时间,有博友在我那篇封装Vue Element的table表格组件的博文下边留言说有没有那种"表格行内编辑"的封装组件,我当时说我没有封装过这样的组件,因为一直以来在实际开发 ...

  7. HDU4467 Graph【轻重点维护】

    HDU4467 Graph 题意: 给出一张染色图,\(n\)个点每个点是黑色或者白色,\(m\)条带权边,\(q\)次操作,有两种操作: 改变一个点的颜色 问所有边中两个端点的颜色为给定情况的边权和 ...

  8. 【bzoj 3333】排队计划(线段树)

    n个数,求一次逆序对.接着有m次修改操作,把每次输入的位置p的数之后<=它的数取出来,从小到大排序后再放回空位里,求逆序对.(N,M<=500,000 , Ai<=10^9)思路:1 ...

  9. uva10891 Game of Sum(博弈+区间dp+优化)

    题目:点击打开链接 题意:两个人做游戏,共有n个数,每个人可以任选一端取任意多连续的数,问两个人都想拿最多的情况下,先手最多比后手多拿多少分数. 思路:这题一开始想到的是用dp[i][j]表示区间[i ...

  10. 南阳ccpc C题 The Battle of Chibi && hdu5542 The Battle of Chibi (树状数组优化+dp)

    题意: 给你一个长度为n的数组,你需要从中找一个长度为m的严格上升子序列 问你最多能找到多少个 题解: 我们先对原序列从小到大排序,排序之后的序列就是一个上升序列 这里如果两个数相等的话,那么因为题目 ...