c++String类的运算符重载---21
原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/
一,创建测试程序包

测试代码如下:
/* Date: 2017-5-4
* Description: String operator overload test program
* Filename: string_operator.h
* Author: Myron Zhou
*/ #ifndef __STRING_OPERATOR_h_
#define __STRING_OPERATOR_h_ #include <iostream>
#include <string.h> using namespace std; class MyString
{
public:
//三个重载的构造函数
MyString();
MyString(const char* str);
MyString(const MyString& str);
//析构函数
~MyString(); //重载运算符
MyString& operator = (const MyString& str);
char& operator[](int index); //访问下标
friend ostream& operator << (ostream& out, const MyString& str); //重载输出操作符
friend istream& operator >> (istream& in, MyString& str); //重载输入操作符
friend MyString operator + (const MyString& str1, const MyString& str2); //重载加号操作符,注意返回引用不行
friend MyString operator += (MyString& str1, const MyString& str2); //重载+=操作符
friend bool operator == (const MyString& str1, const MyString& str2); //重载相等操作符
friend bool operator != (const MyString& str1, const MyString& str2); //重载不相等操作符 private:
char* p;
int len;
}; #endif
/* Date: 2017-5-4
* Description: String operator overload test program
* Filename: string_operator.cpp
* Author: Myron Zhou
*/
#include "string_operator.h"
using namespace std; //默认构造函数,初始化为空串
MyString::MyString()
{
len = ;
p = new char[len + ];
p[] = '\0';
}
//构造函数,用一个字符串初始化
MyString::MyString(const char* str)
{
len = strlen(str);
p = new char[strlen(str) + ];
strncpy(p, str,len+);
}
//拷贝构造函数,用另外一个string初始化
MyString::MyString(const MyString& str)
{
len = str.len;
p = new char[strlen(str.p) + ];
strncpy(p, str.p, strlen(str.p) + );
}
//析构函数
MyString::~MyString()
{
delete[] p;
}
//重载赋值操作符( = )
MyString& MyString::operator = (const MyString& str)
{
if (this->p == str.p)
{
return *this;
}
delete[] p;
len = str.len;
p = new char[len + ];
strncpy(p, str.p, len + );
return *this;
}
//重载输出操作符( << )
ostream& operator << (ostream& out, const MyString& str)
{
out << str.p;
return out;
}
//重载输入操作符( >> )
istream& operator >> (istream& in, MyString& str)
{
in >> str.p;
return in; }
//重载加号操作符( + )
MyString operator + (const MyString& str1, const MyString& str2)
{
MyString str;
delete[] str.p;
str.len = str1.len + str2.len;
str.p = new char[str.len + ];
strncpy(str.p, str1.p, str.len + );
strncat(str.p, str2.p, str.len + );
return str;
}
//重载相加赋值操作符( += )
MyString operator += (MyString& str1, const MyString& str2)
{
str1 = str1 + str2;
return str1;
}
//重载相等操作符
bool operator == (const MyString& str1, const MyString& str2)
{
if (strcmp(str1.p, str2.p) == )
{
return true;
}
return false;
}
//重载不相等操作符
bool operator != (const MyString& str1, const MyString& str2)
{
if (strcmp(str1.p, str2.p) == )
{
return false;
}
return true;
} //重载下标([])
char& MyString::operator[](int index)
{
return p[index];
}
/* Date: 2017-5-4
* Description: String operator overload test program
* Filename: main.cpp
* Author: Myron Zhou
*/ #include "string_operator.h" int main()
{
MyString mystr("this is test program!"); //测试构造函数,用一个字符串初始化
cout << mystr[] << endl;
mystr[] = 'd';
cout << mystr <<endl;
MyString mystr2(mystr); //用另外一个string初始化
cout << mystr2 << endl;
MyString mystr3;
mystr3 = mystr + mystr2; //测试加号运算符,测试赋值运算符
cout << mystr + mystr2 << endl;
mystr3 += mystr; //测试+=运算符
cout << mystr3 << endl;
cout << (mystr == mystr2) << endl; //测试 ==
cout << (mystr != mystr3) << endl; //测试 !=
MyString mystr4;
cout << "good luck!" << endl;
cin >> mystr4; //测试重载的输入符号( >> )
cout << mystr4 << endl; return ;
}
二,编译运行代码

c++String类的运算符重载---21的更多相关文章
- string类中运算符重载实现
C++中预定义的加.减等运算符的操作对象只能是基本的数据类型.如果要在用户自定义的类型对象上应用同样的运算符,就需要通过运算符重载来重新定义其实现,使它能够用于自定义类型执行特定的操作,所以运算符重载 ...
- YTU 2617: B C++时间类的运算符重载
2617: B C++时间类的运算符重载 时间限制: 1 Sec 内存限制: 128 MB 提交: 284 解决: 108 题目描述 C++时间类的运算符重载 定义一个时间类Time,其数据成员为 ...
- 问题 C: B C++时间类的运算符重载
题目描述 C++时间类的运算符重载 定义一个时间类Time,其数据成员为表示时间的小时(hour).分(minute),秒(second). 重载运算符“+”,使之能用于时间对象的加法运算:重载运算符 ...
- sdut 4-1 复数类的运算符重载
4-1 复数类的运算符重载 Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 通过本题目的练习能够掌握成员运算符重载及友元运算符重载 要求定义一个复数类.重 ...
- 理解String拼接,+运算符重载的实际效果
引申:一个常见的String的面试题 public static void main(String[] args) { // TODO Auto-generated method stub Strin ...
- 问题 B: 矩形类中运算符重载【C++】
题目描述 定义一个矩形类,数据成员包括左下角和右上角坐标,定义的成员函数包括必要的构造函数.输入坐标的函数,实现矩形加法,以及计算并输出矩形面积的函数.要求使用提示中给出的测试函数并不得改动. 两个矩 ...
- C# 类型运算符重载在类继承中的调用测试
这是一篇晦涩难懂的片面的研究 一,简单的继承层次 class CA { } class CB : CA{ } class CC : CB{ } } void Test(CA oa){//CATest ...
- 玩转C++运算符重载
运算符重载语法:返回值类型 operator运算符(参数列表) { 代码逻辑... } C++中的运算符重载是通过函数来实现的,可以将重载的运算符看作是类成的一个成员函数,向普通函数一样调用.如重 ...
- C#基础加强(6)之引用相等与运算符重载
引用相等 介绍 在 C# 中可以通过 object.ReferenceEquals(obj1, obj2) 方法来判断两个变量引用的是不是同一个地址,如果是,那么就是引用相等. 引用相等是针对引用类型 ...
随机推荐
- 将html转换为Drupal模板文件的一般步骤
本篇文章以自定义page.tpl.php文件为例,介绍在Drupal主题开发工作中,将html文件转换为tpl模板文件的一般步骤. 仅保留html文件中body标记之间的内容(不含body标记),其他 ...
- Ubuntu下架设FTP服务器
Linux下提供了很多的ftp服务器,这里我选用了安全,快速,简单的vsftpd作为FTP服务器.本文是我在自己的Ubuntu 10.10 -32 位系统下搭建的.搭建方法简单,按照本过程,您也可以完 ...
- Scrapy安装错误:Microsoft Visual C++ 14.0 is required
问题描述 当前环境win10,python_3.6.1,64位. 在windows下,在dos中运行pip install Scrapy报错: building 'twisted.test.raise ...
- Loadrunner 26377错误
26377错误的成因很多,总结最直接的结果就是No match found for the requested parameter "XXXXX".意思就是没有找到关联变量匹配的值 ...
- Android 8 AudioPolicy 初始化
记录一下AudioPolicy初始化过程. frameworks\av\media\audioserver\audioserver.rc service audioserver /system/bin ...
- e803. 获得和设置JProgressBar的值
// To create a progress bar, see e801 创建一个JProgressBar组件 // Get the current value int value = progre ...
- Linq to Entity 动态拼接查询条件(重点是OR)
public static class PredicateExtensions { /// <summary> /// 机关函数应用True时:单个AND有效,多个AND有效:单个OR无效 ...
- C#基础 ---------------单利模式
一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设计模式>,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了 ...
- js 正则去重
split():字符串中的方法,把字符串转成数组. sort():数组中的排序方法,按照ACALL码进行排序. join():数组中的方法,把数组转换为字符串 var demo="ababb ...
- Intellij Idea反向生成Hibernate实体类
每次根据数据库的表反向生成实体类老不记得步骤...脑子不够用,这里特意记录一下.碰到的问题也及时更新到这里来. 1. 工程添加Hibernate支持 两种方式: 第一种:工程上右键选择 "A ...