题目介绍

C++岗位面试题:实现自定义MyString类,实现拷贝构造函数和 []、=、+、== 、!=、<< 、>> 运算符重载函数。
自定义MyString估计是C++岗位常考的题目吧,能够较好的验证面试者对C++基础知识掌握的是否牢固。值得每个C++程序员注意的时,如果参数有传递引用,一定要有非空验证,因为引用帮我们封装了指针,MyString *pStr = nullptr; 将*pstr传递给引用参数是不会报错的,但是程序运行会崩溃的!
下面是笔者的写法。

MyString.h

#pragma once
#include <cstdlib>
#include <iostream>
using namespace std;
class MyString
{
public:MyString(const char* pData = nullptr);MyString(const MyString& otherStr);~MyString();MyString& operator=(const MyString& otherStr);MyString& operator=(const char* pData);char& operator[](unsigned int index);MyString operator+(const MyString &str);MyString operator+(const char* pData);bool operator==(const MyString &str);bool operator==(const char* pData);bool operator!=(const MyString &str);bool operator!=(const char* pData);friend ostream& operator<<(ostream& cout, const MyString& str);friend istream& operator>>(istream& cin, MyString& str);private:char* m_pData;int m_size;int m_capacity;
};
ostream& operator<<(ostream& cout, const MyString& str);istream & operator >> (istream & cin, MyString & str);

MyString.cpp

#include "01MyString.h"/* 普通构造函数 */
MyString::MyString(const char * pData)
{if (nullptr == pData){m_size = 0;m_capacity = 100;m_pData = new char[m_capacity]{ 0 };return;}m_size = strlen(pData);m_capacity = 2 * m_size + 1;    //开辟2倍大空间,方便后续存储m_pData = new char[m_capacity]{ 0 };strcpy(m_pData, pData);
}
/* 拷贝构造函数 */
MyString::MyString(const MyString & otherStr)
{if (nullptr == &otherStr)   //参数传递引用时一定要做非空验证{m_size = 0;m_capacity = 100;m_pData = new char[m_capacity] { 0 };return;}m_size = otherStr.m_size;m_capacity = otherStr.m_capacity;m_pData = new char[m_capacity]{ 0 };strcpy(m_pData, otherStr.m_pData);
}/* 析构函数 */
MyString::~MyString()
{if(nullptr != m_pData)delete[] m_pData;
}MyString & MyString::operator=(const MyString & otherStr)
{if (this != &otherStr)          //剑指offer写法{MyString tmpStr(otherStr);  //调用拷贝构造,交换字符串指针char* p = tmpStr.m_pData;tmpStr.m_pData = m_pData;m_pData = p;}return *this;
}MyString & MyString::operator=(const char * pData)
{MyString tmpStr(pData); //调用构造函数char* p = tmpStr.m_pData;tmpStr.m_pData = m_pData;m_pData = p;return *this;
}/* 返回新对象 */
MyString MyString::operator+(const MyString & str)
{if (nullptr == &str){return MyString(*this);}int newSize = m_size + str.m_size + 1;char* temp = new char[newSize] {0};strcat(temp, m_pData);strcat(temp, str.m_pData);MyString res(temp);delete[] temp;return res;
}
/* 返回新对象 */
MyString MyString::operator+(const char * pData)
{if (nullptr == pData){return MyString(pData);}int newSize = m_size + strlen(pData) + 1;char* temp = new char[newSize] {0};strcat(temp, m_pData);strcat(temp, pData);MyString res(temp);delete[] temp;return res;
}char & MyString::operator[](unsigned int index)
{return m_pData[index];
}bool MyString::operator==(const MyString & str)
{bool res = false;if (nullptr == &str)res = false;if (this == &str)res = true;if (strcmp(m_pData, str.m_pData) == 0)res = true;return res;
}bool MyString::operator==(const char * pData)
{bool res = false;if (nullptr == pData)res = false;if (strcmp(m_pData, pData) == 0)res = true;return res;
}bool MyString::operator!=(const MyString & str)
{return !operator==(str);
}bool MyString::operator!=(const char * pData)
{return !operator==(pData);
}ostream& operator<<(ostream& cout, const MyString& str)
{if (nullptr == &str)return cout;cout << str.m_pData;return cout;
}inline istream & operator >> (istream & cin, MyString & str)
{if (nullptr == &str)return cin;memset(str.m_pData, 0, str.m_capacity); //清空数据cin >> str.m_pData;return cin;
}int main(int argc, char *argv[])
{//测试 构造函数 拷贝构造函数MyString name = "Laymond";MyString copyName = name;cout << name << " " << copyName << endl;//测试 [] 运算符copyName[0] = 'A';cout << copyName << endl;//测试 + = 运算符copyName = name + " is " + "good !";cout << copyName << endl;//测试<< >> == != 运算符MyString str1, str2;cin >> str1 >> str2;cout << "str1:"<<str1 << endl;cout << "str2:"<<str2 << endl;cout << (MyString("hello") == "hello") << endl;cout << (MyString("hello") != MyString("hello")) << endl;cout << (MyString("hello") == MyString("hello")) << endl;//在参数中引用的地方,一定要做非空验证,比如说如下,如果拷贝构造函数 没有做非空验证 程序会崩溃MyString *pStr = NULL;MyString str(*pStr);return 0;
}

运行检测

C/C++面试题—实现MyString类相关推荐

  1. 华为工程师面试题库—通信类

    华为工程师面试题库-通信类 [ 2007-5-21 16:41:00 | By: bjxiong ]   应聘华为各类工程师通信基础题库以及答案-知己知彼.百战不殆 电信基础知识题库 (以下题目可以按 ...

  2. 【Python面试题】-元类

    [Python面试题]-元类 1.Python 中类方法.类实例方法.静态方法有何区别? 类方法:是类对象的方法,在定义时需要在上方使用"@classmethod"进行装饰,形参为 ...

  3. 高职计算机辅助设计CAD期中考试题,计算机辅助设计CAD绘图员(中级)技能鉴定试题(新)(机械类)模拟题...

    <计算机辅助设计CAD绘图员(中级)技能鉴定试题(新)(机械类)模拟题>由会员分享,可在线阅读,更多相关<计算机辅助设计CAD绘图员(中级)技能鉴定试题(新)(机械类)模拟题(4页珍 ...

  4. 试题名称 消除类游戏

    试题名称 消除类游戏 时间限制: 1.0s 内存限制: 256.0MB 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色 ...

  5. JAVA面试题(part7)--Integer类

    学习笔记,仅供参考 JAVA面试题 请看下面一段代码,写出它的输出结果 package com.guiyang.restudy3;public class D5Integer {public stat ...

  6. string s = new string(“xyz“);创建了几个对象_「005」-JavaSE面试题(五):String类

    第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [005] - JavaSE面试题(五):String类 第1问:String.StringBuf ...

  7. java 字符串 面试题_Java常用类String的面试题汇总(java面试题)

    1.比较两个字符串时使用"=="还是equals()方法? 当然是equals方法."=="测试的是两个对象的引用是否相同,而equals()比较的是两个字符串 ...

  8. 计算机辅助设计绘图员技能鉴定试题(建筑类),计算机辅助设计绘图员(中级)技能鉴定试题(建筑类)A.doc...

    建筑CAD中级证指导资料(内部)试卷讲解 计算机辅助设计绘图员(中级)技能鉴定试题(建筑类)A 考试说明: 本试卷共4题: 考生必须在考评员指定的硬盘驱动器下建立一个以自己准考证后8位命名的文件夹: ...

  9. C++实现Mystring类,C++基础

    文章目录 前言 一.实现功能 二.代码 三.总结 前言 C++与C语言的最大区别之一便是C++是面向对象的编程,是为了解决大规模问题而诞生的,既然是为了解决大规模问题而诞生的,那么C++在域的划分上一 ...

最新文章

  1. Spring来装配组件
  2. JavaFX其他事件
  3. sso单点登录系统(解决session共享)
  4. WCF创建Rest服务(附:.net2.0创建Rest服务)
  5. Eclipse 中 去掉 行末端(尾部) 的 空格。(需要「AnyEdit」插件)
  6. java disp()_【matlab】输出显示函数 sprintf()disp()
  7. python模块--hashlib
  8. win7_32下编译FFmpeg
  9. 一种常见(粒度,统计值)报表的实现方案
  10. kettle 无法连接数据库
  11. egg mysql insert_egg-mysql
  12. Wet Shark and Flowers(思维)
  13. python实现动态壁纸_如何实现一个 windows 桌面动态壁纸
  14. 如何查看局域网内所有IP
  15. android 波斯文排序,android 阿拉伯,波斯字符串从右到左显示问题
  16. YankNote 笔记软件比 Sublime 好用吗
  17. 【算法】1282. 用户分组(多语言实现)
  18. 第一卷清晨的帝国 第一百四十三章 辩难始
  19. linux sqlserver有图形化吗,SQL Server for Linux 下一版本的公共预览
  20. 【awk】输出不同列、左对齐or右对齐

热门文章

  1. 2.1基本算法之枚举_1749数字方格
  2. 白鹭引擎egret wing编辑器提示报错 egret 命令不存在 乱码的情况解决方法
  3. RTX5 | 信号量01 - 信号量的使用
  4. ajax ssm 页面跳转_SSM用jq整合Ajax入门案例讲解
  5. 1327集群_MPT1327集群通讯系统
  6. 怎么引jsp包_电机引接线的制作流程防护等级
  7. SpringShell文档阅读笔记-SpringShell的基本使用
  8. Spring Boot文档阅读笔记-构建SOAP的web Service Client
  9. Qt文档阅读笔记-QUdpSocket基本表述及简单实现
  10. 计算特征矩阵及哈希值(含OpenCV代码)