#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. Flink安装部署

    官网:https://ci.apache.org/projects/flink/flink-docs-release-1.7/ops/deployment/cluster_setup.html cd ...

  2. 配置samba的流程

    1.关闭防火墙和selinuxservice iptables stopsetenforce 02.配置本地yummount /dev/cdrom /mediacd /etc/yum.repos.dc ...

  3. 4种好用的python编辑器

    1.Sublime Text: 这是一个轻量级的代码编辑器,跨平台,支持几十种编程语言,包括Python,Java,C/C++等,小巧灵活,运行轻快,支持代码高亮.自动补全.语法提示,插件扩展丰富,是 ...

  4. 7.3.5 Tomcat堆溢出分析(1)

    实战Java虚拟机:JVM故障诊断与性能优化>第7章分析Java堆,本章主要介绍了Java堆的分析方法.首先,介绍了几种常见的Java内存溢出现象及解决思路.其次,探讨了java.lang.St ...

  5. JDK中所包含的设计模式

    本文主要是归纳了JDK中所包含的设计模式,包括作用和其设计类图.首先来个总结,具体的某个模式可以一个一个慢慢写,希望能对研究JDK和设计模式有所帮助. 一.设计模式是什么(1)反复出现问题的解决方案( ...

  6. EF core2.1+MySQL报错'Void Microsoft.EntityFrameworkCore.Storage.Internal.RelationalParameterBuilder..ctor(Microsoft.EntityFrameworkCore.Storage.IRelationalTypeMapper)

    一.使用.net core 2.0 EF mysql 运行一直报错如下: An unhandled exception occurred while processing the request. M ...

  7. (8/24) 图片跳坑大战--css中的图片处理

    前言:此节的开展是在上一节的基础上进行的,(每一节都是从无到有编写关于此节的知识),最后会附上相关完整代码.上一节 CSS中的图片处理 1.新建images文件夹 在src目录下新建一个images文 ...

  8. 慕课网c#开发轻松入门6-8最终项目

    下面是一些同学的姓名和对应的考试分数,请输出他们的平均分和高于平均分的同学姓名. 运行效果如下: using System; using System.Collections.Generic; usi ...

  9. maven repository pom

    场景: 如果maven setting.xml 中没指定国内的镜像 可以通过在项目中的pom中指定 指定repository : <properties> <java.version ...

  10. 属性控件CMFCPropertyGridCtrl简单用法

    这是我的原创! 用一堆的编辑框下拉框做配置界面,很是繁琐,还要对齐排版……用这个属性控件 CMFCPropertyGridCtrl 就可以统一风格了. //初始化 CMFCPropertyGridCt ...