剑指offer-------赋值运算符函数(面试题1)题目与答案

题目:如下类型CMYString的声明,请为该类型添加赋值运算符函数

    class CMyString
    {
     public:
          class CMyString(char* pData=nullptr);
          CMyString(const CMyString& str);
          ~CMyString(void);
    private:
          char*m_pData;
    };

试题源代码:

									#include<cstring>
									#include<cstdio>
									#pragma warning(disable:4996)
									class CMyString
									{
									public:
										CMyString(char* pData = nullptr);
										CMyString(const CMyString& str);
										~CMyString(void);
										CMyString& operator = (const CMyString& str);
										void Print();
									private:
										char* m_pData;
									};
									CMyString::CMyString(char *pData)
									{
										if (pData == nullptr)
										{
											m_pData = new char[1];
											m_pData[0] = '\0';
										}
										else
										{
											int length = strlen(pData);
											m_pData = new char[length + 1];
											strcpy(m_pData, pData);
										}
									}
									CMyString::CMyString(const CMyString &str)
									{
										int length = strlen(str.m_pData);
										m_pData = new char[length + 1];
										strcpy(m_pData, str.m_pData);
									}
									
									CMyString::~CMyString()
									{
										delete[] m_pData;
									}
									
									CMyString& CMyString::operator = (const CMyString& str)
									{
										if (this == &str)
											return *this;
										delete[]m_pData;
										m_pData = nullptr;
										m_pData = new char[strlen(str.m_pData) + 1];
										strcpy(m_pData, str.m_pData);
										return *this;
									}
									// ====================测试代码====================
									void CMyString::Print()
									{
										printf("%s", m_pData);
									}
									
									void Test1()
									{
										printf("Test1 begins:\n");
										char text[] = "Hello world";
										char*p= text;
										CMyString str1(text);
										CMyString str2;
										str2 = str1;
										printf("The expected result is: %s.\n", text);
										printf("The actual result is: ");
										str2.Print();
										printf(".\n");
									}
									// 赋值给自己
									void Test2()
									{
										printf("Test2 begins:\n");
										char text[] = "Hello world";
										char*p = text;
										CMyString str1(text);
										str1 = str1;
										printf("The expected result is: %s.\n", text);
										printf("The actual result is: ");
										str1.Print();
										printf(".\n");
									}
									// 连续赋值
									void Test3()
									{
										printf("Test3 begins:\n");
										char text[] = "Hello world";
										char*p = text;
										CMyString str1(text);
										CMyString str2, str3;
										str3 = str2 = str1;
										printf("The expected result is: %s.\n", text);
										printf("The actual result is: ");
										str2.Print();
										printf(".\n");
										printf("The expected result is: %s.\n", text);
										printf("The actual result is: ");
										str3.Print();
										printf(".\n");
									}
									int main(int argc, char* argv[])
									{
										Test1();
										Test2();
										Test3();
										return 0;
									}


大家需要注意的是:我的编译器是vs2017,我们一般解决的方法为:测试一段程序,里面有strcpy这个函数  但是在VS编译器中会报警告 

error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>c:\program files (x86)\windows kits\10\include\10.0.17134.0\ucrt\string.h(133): note: 参见“strcpy”的声明

问题出在编译器身上  VS已经不支持strcpy函数  认为是不安全的  可能会产生诸如内存泄露、缓冲区溢出、非法访问等安全问题

所以要在老版本的函数后面加 _s  但是需要3个或多个参数  因为这个不是要测试的重点 ,所以并没有改函数  仍然用strcpy进行测试。

搜寻到了两种解决方案。

一、在程序的最前面加上 #pragma warning(disable:4996)   表示为忽略改警告 。

1. #pragma warning只对当前文件有效(对于.h,对包含它的cpp也是有效的),而不是对整个工程的所有文件有效。当该文件编译结束,设置也就失去作用。

2. #pragma warning(push) 存储当前报警设置。

#pragma warning(push, n) 存储当前报警设置,并设置报警级别为n。n为从1到4的自然数。

3. #pragma warning(pop) 恢复之前压入堆栈的报警设置。在一对push和pop之间作的任何报警相关设置都将失效。

4. #pragma warning(disable: n)将某个警报置为失效

5. #pragma warning(default: n)将报警置为默认

二、可以使用_CRT_SECURE_NO_DEPRECATE标记来忽略这些警告问题。办法是在编译选项 C/C++ | Preprocessor | Preprocessor Definitions中,增加_CRT_SECURE_NO_DEPRECATE标记即可
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

N1314N

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值