C/C++面试题—实现MyString类
题目介绍
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类相关推荐
- 华为工程师面试题库—通信类
华为工程师面试题库-通信类 [ 2007-5-21 16:41:00 | By: bjxiong ] 应聘华为各类工程师通信基础题库以及答案-知己知彼.百战不殆 电信基础知识题库 (以下题目可以按 ...
- 【Python面试题】-元类
[Python面试题]-元类 1.Python 中类方法.类实例方法.静态方法有何区别? 类方法:是类对象的方法,在定义时需要在上方使用"@classmethod"进行装饰,形参为 ...
- 高职计算机辅助设计CAD期中考试题,计算机辅助设计CAD绘图员(中级)技能鉴定试题(新)(机械类)模拟题...
<计算机辅助设计CAD绘图员(中级)技能鉴定试题(新)(机械类)模拟题>由会员分享,可在线阅读,更多相关<计算机辅助设计CAD绘图员(中级)技能鉴定试题(新)(机械类)模拟题(4页珍 ...
- 试题名称 消除类游戏
试题名称 消除类游戏 时间限制: 1.0s 内存限制: 256.0MB 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色 ...
- JAVA面试题(part7)--Integer类
学习笔记,仅供参考 JAVA面试题 请看下面一段代码,写出它的输出结果 package com.guiyang.restudy3;public class D5Integer {public stat ...
- string s = new string(“xyz“);创建了几个对象_「005」-JavaSE面试题(五):String类
第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [005] - JavaSE面试题(五):String类 第1问:String.StringBuf ...
- java 字符串 面试题_Java常用类String的面试题汇总(java面试题)
1.比较两个字符串时使用"=="还是equals()方法? 当然是equals方法."=="测试的是两个对象的引用是否相同,而equals()比较的是两个字符串 ...
- 计算机辅助设计绘图员技能鉴定试题(建筑类),计算机辅助设计绘图员(中级)技能鉴定试题(建筑类)A.doc...
建筑CAD中级证指导资料(内部)试卷讲解 计算机辅助设计绘图员(中级)技能鉴定试题(建筑类)A 考试说明: 本试卷共4题: 考生必须在考评员指定的硬盘驱动器下建立一个以自己准考证后8位命名的文件夹: ...
- C++实现Mystring类,C++基础
文章目录 前言 一.实现功能 二.代码 三.总结 前言 C++与C语言的最大区别之一便是C++是面向对象的编程,是为了解决大规模问题而诞生的,既然是为了解决大规模问题而诞生的,那么C++在域的划分上一 ...
最新文章
- Spring来装配组件
- JavaFX其他事件
- sso单点登录系统(解决session共享)
- WCF创建Rest服务(附:.net2.0创建Rest服务)
- Eclipse 中 去掉 行末端(尾部) 的 空格。(需要「AnyEdit」插件)
- java disp()_【matlab】输出显示函数 sprintf()disp()
- python模块--hashlib
- win7_32下编译FFmpeg
- 一种常见(粒度,统计值)报表的实现方案
- kettle 无法连接数据库
- egg mysql insert_egg-mysql
- Wet Shark and Flowers(思维)
- python实现动态壁纸_如何实现一个 windows 桌面动态壁纸
- 如何查看局域网内所有IP
- android 波斯文排序,android 阿拉伯,波斯字符串从右到左显示问题
- YankNote 笔记软件比 Sublime 好用吗
- 【算法】1282. 用户分组(多语言实现)
- 第一卷清晨的帝国 第一百四十三章 辩难始
- linux sqlserver有图形化吗,SQL Server for Linux 下一版本的公共预览
- 【awk】输出不同列、左对齐or右对齐
热门文章
- 2.1基本算法之枚举_1749数字方格
- 白鹭引擎egret wing编辑器提示报错 egret 命令不存在 乱码的情况解决方法
- RTX5 | 信号量01 - 信号量的使用
- ajax ssm 页面跳转_SSM用jq整合Ajax入门案例讲解
- 1327集群_MPT1327集群通讯系统
- 怎么引jsp包_电机引接线的制作流程防护等级
- SpringShell文档阅读笔记-SpringShell的基本使用
- Spring Boot文档阅读笔记-构建SOAP的web Service Client
- Qt文档阅读笔记-QUdpSocket基本表述及简单实现
- 计算特征矩阵及哈希值(含OpenCV代码)