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) 方法来判断两个变量引用的是不是同一个地址,如果是,那么就是引用相等. 引用相等是针对引用类型 ...
随机推荐
- linq操作符:限定操作符
限定操作符运算返回一个Boolean值,该值指示序列中是否有一些元素满足条件或者是否所有元素都满足条件. 一.All操作符 All方法用来确定是否序列中的所有元素都满足条件.看下面的例子: using ...
- Java设计模式(2)单态模式(Singleton模式)
定义:Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作. 还有,singleton能够被状态化 ...
- 升级ndk后Android studio的build错误
上周末升级了ndk,应该是最新版的v17.0版本了,当时也没测试,屁颠屁颠的就回家撸猫了... 今天一跑代码在build时报错: ABIs [armeabi] are not supported fo ...
- USB2.0学习笔记连载(六):USB2.0硬件设计需要注意事项
笔者在设计USB2.0时找到了一个官方给的硬件设计正确设计指南,其中有些内容还挺nice的.不单单只是USB的设计,其中有些思想可以应用到其他的场合中. 对于USB2.0而言,全速状态下可以达到480 ...
- 启动另一个app
(一) 通过包名.类名 开发有时需要在一个应用中启动另一个应用,比如Launcher加载所有的已安装的程序的列表,当点击图标时可以启动另一个应用.一般我们知道了另一个应用的包名和MainActivit ...
- (笔记)Linux下system()函数的深度理解(整理)
注:从其它地方转的非常好的一篇文章,值得深究! 这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数 ...
- 第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表、课程评论表、用户收藏表、用户消息表、用户学习表
第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表.课程评论表.用户收藏表.用户消息表.用户学习表 创建名称为ap ...
- 批量kill 进程
场景: 需要批量kill tail 进程. 解决方法: ps -ef | grep IC.IndexServer.log | grep -v grep | awk -F' ' '{print $2}' ...
- e611. Setting Focus Traversal Keys for the Entire Application
This example changes the focus traversal keys for the entire application. For an example of how to c ...
- How to suppress 'Maybe this is program method' warnings from ProGuard
11down votefavorite 2 I'm using ProGuard with my Android application and I'm running getting the war ...