首页 > 系统相关 >C++Primer Plus 第12章 类和动态内存分配 12.10编程练习第2题new,delete的指向深度拷贝

C++Primer Plus 第12章 类和动态内存分配 12.10编程练习第2题new,delete的指向深度拷贝

时间:2024-06-10 14:05:04浏览次数:13  
标签:12 const String lvalue C++ char pText Plus operator

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:本章练习第2题

涉及标准函数及关键词

toupper,tolower(), strcpy_s(),strcat_s(),strcmp,strlen(),new[],delete[].


实现如下效果
输出应与下面相似:
Please enter yourname:Fretta Farbo
My name is Fretta Farbo.
The string
MY NAME IS FRETTA FARBO ANDIAMA++ STUDENT.
contains 6’'characters in it.
Enter the name of a primary color for mixing light: yellowTry again!
BLUE
That’s right!
Bye

原文链接:https://blog.csdn.net/zhyjhacker/article/details/139555079
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着学习的升入,练习是必不可少的重要环节


提示:以下是本篇文章正文内容,下面案例可供参考

一、2.通过完成下面的工作来改进 String类

声明(即将 Stringl.h升级为 String2.h)。

a.对+运算符进行重载

使之可将两个字符串合并成1个。

b.提供一个 Stinglow()成员函数

将字符串中所有的字母字 符转换为小写(别忘了cctype 系列字符函数)。

c.提供 String()成员函数

将字符串中所有字母字符转换成大写。

d.提供一个这样的成员函数

它接受一个 char参数,返回该字符在字符串中出现的次数。使用下面的程序来测试您的工作:


二、头文件的定义

1.头文件

代码如下(示例):

 #ifndef PE12_2_H_
#define PE12_2_H_
namespace NString
{
	class String
	{
	public:
		static const unsigned buffMaxSize = 256;
		String(const char* text = " ");
		String(const String& str);
		~String();

		unsigned getLength(void)const;
		const char* toCstr(void)const;
		void stringUp(void);//to up
		void stringlow(void);//to low 
		unsigned has(char ch)const;

		String& operator=(const String& str);
		String& operator+=(const String& str);
		friend std::istream& operator>>(std::istream& is, String& str);
		char& operator[](unsigned index);
		const char& operator[](unsigned index)const;
	private:
		unsigned textLength;
		char* pText;
		void assignMember(const char* text);
	};

	std::ostream& operator<<(std::ostream& os, const String& str);

	bool operator<(const String& lvalue, const String& rvalue);
	bool operator>(const String& lvalue, const String& rvalue);
	bool operator==(const String& lvalue, const String& rvalue);
	bool operator<=(const String& lvalue, const String& rvalue);
	bool operator>=(const String& lvalue, const String& rvalue);

	String operator+(const String& lvalue, const String& rvalue);
}

#endif // !PE12_2_H_




2.方法

代码如下(示例):

 //pe12_2.cpp
#include<iostream>
#include<cstring>
#include<cctype>
#include"pe12_2.h"

namespace NString
{ 
	using std::ostream;
	using std::istream;

	String::String(const char* text)
	{
		assignMember(text);
	}

	String::String(const String& str)
	{
		assignMember(str.toCstr());
	}

	String::~String()
	{
		delete[]pText;
	}

	void 
	String::stringlow(void)
	{
		for (unsigned i = 0; i < textLength; i++)
		{
			pText[i] = (char)tolower((int)pText[i]);
		}
	}
	void
	String::stringUp(void)
	{
		for (unsigned i = 0; i < textLength; i++)
		{
			pText[i] = (char)toupper((int)pText[i]);
		}
	}

	unsigned 
	String::getLength(void)const
	{
		return (textLength);
	}

	unsigned
	String::has(char ch)const
	{
		unsigned chCnt = 0;
		for (unsigned i = 0; i < textLength; i++)
		{
			if (ch == pText[i])
			{
				++chCnt;
			}
		}
		return chCnt;
	}
	const char*
	String::toCstr(void)const
	{
		return pText;
	}
	//私有成员
	void
	String::assignMember(const char* text)
	{
		textLength = strlen(text);
		pText = new char[textLength + 1];
		strcpy_s(pText, textLength+1, text);
	}

	//重载运算符
	String&
	String::operator=(const String& str)
	{
		if (&str == this)
		{
			return *this;
		}
		delete[]pText;
		assignMember(str.toCstr());
		return *this;
	}

	String&
	String::operator+=(const String& str)
	{
		return (*this = *this + str);
	}

	char&
	String::operator[](unsigned index)
	{
		return(pText[index]);
	}

	const char&
	String::operator[](unsigned index)const
	{
		return (pText[index]);
	}

	ostream&
	operator<<(ostream& os, const String& str)
	{
		os << str.toCstr();
		return os;
	}

	istream& operator>>(istream& is, String& str)
	{
		char text[String::buffMaxSize];
		if (is>>text)
		{
			str = text;
		}
		is.ignore(String::buffMaxSize, '\n');
		return is;
	}

	bool
	operator<(const String& lvalue, const String& rvalue)
	{
		return (strcmp(lvalue.toCstr(), rvalue.toCstr()) < 0);
	}

	bool 
	operator>(const String& lvalue, const String& rvalue)
	{
		return (rvalue < lvalue);
	}

	bool
	operator==(const String& lvalue, const String& rvalue)
	{
		return (!(rvalue < lvalue) && !(rvalue > lvalue));
	}

	bool
	operator<= (const String & lvalue, const String & rvalue)
	{
		return (!(lvalue > rvalue));
	}
	bool
	operator>= (const String & lvalue, const String & rvalue)
	{
		return (!(lvalue < rvalue));
	}
	String operator+(const String& lvalue, const String& rvalue)
	{
		char* pText = new char[lvalue.getLength() + rvalue.getLength() + 1];
		//int test1 = lvalue.getLength() + rvalue.getLength() + 1;
		//int test2 = sizeof(pText);
		//int test3 = strlen(pText);
		strcpy_s(pText, lvalue.getLength()+1 , lvalue.toCstr());
		//strcat_s第二个参数是总的缓冲区的大小。这里和strcpy_s是不一样的。需要注意
		strcat_s(pText, lvalue.getLength() + rvalue.getLength() +1, rvalue.toCstr());
		String temp(pText);
		delete[]pText;
		return (temp);
	}
}


测试函数(题目提供)

//pe12-2.cpp
#include<iostream>
using namespace std;
#include "pe12_2.h"
int main()
{
	String s1(" and I am a C++ student.");
	String s2 = "Please enter your name: ";
	String s3;
	cout << s2;		//overloaded<<operator
	cin >> s3;		//overloaded >>operator
	s2 = "My name is " + s3;//overloaded = ,+OPerators
	cout << s2 << ".\n";
	s2 = s2 + s1;
	s2.stringup();		//converts string to uppercase
	cout << "The string\n" << s2 << "\ncontains " << s2.has('A') << " 'a' characters in it.\n";
	s1 = "red";			//String(const char*),
						//then String & operator=(const String&)
	String rgb[3] = { String(s1),String("greed"),String("blue") };
	cout << "Enter the name of a primary color for mixing light: ";
	String ans;
	bool success = false;
	while (cin>>ans)
	{
		ans.stringlow();//converts string to lowercase
		for (int i = 0; i < 3; i++)
		{
			if (ans == rbg[i]) //overloaded == operator
			{
				cout << "That's right.\n";
				success = true;
				break;
			}
		}
		if (success)
		{
			break;
		}
		else
		{
			cout << "Try again!\n";
		}
	}
	cout << "Bye\n";
	return 0;
}


总结

提示:这里对文章进行总结:

例如:

1,对strcpy_s函数赋值用strlen取到长度需+1,对字符串而言,如果是数组的话,不需要数组长度。但是需要在数组追加最后一个元素‘\0’
2,strcpy_s,函数做追加的话中间的大小是整个字符串的大小,而不是追加上来的大小。这里要熟知
3,最后就是一定要多练习。c++是实操性很强大的工具,需要熟练的练习,工具比较繁琐。但是带来的好处就是功能强大。


标签:12,const,String,lvalue,C++,char,pText,Plus,operator
From: https://blog.csdn.net/zhyjhacker/article/details/139573805

相关文章

  • 2024 XTU PDE 12题 两点边值问题有限体积格式
    考虑如下两点边值问题\[\begin{cases}-u^{''}+10(2x-1)u'+20u=0,\quad0<x<1,\\u(0)=u(1)=1.\end{cases}\]真解取为\[u=e^{-10x(1-x)}.\]写出求解上述问题的有限体积格式。编程实现上述有限体积法,并计算节点处的最大误差,考查其收敛阶。解:(a)有限体积格式:\[\left\{\beg......
  • Leetcode-1221
    题目1221.分割平衡字符串难度:简单在一个平衡字符串中,'L'和'R'字符的数量是相同的。给你一个平衡字符串s,请你将它分割成尽可能多的平衡字符串。注意:分割得到的每个字符串都必须是平衡字符串,且分割得到的平衡字符串是原平衡字符串的连续子串。返回可以通过分割得到的平衡......
  • C++多态详解:静态多态与动态多态的实现
    C++中的多态是面向对象编程的重要特性,允许相同的接口调用不同的实现。多态性可以分为两类:静态多态和动态多态。1.静态多态(编译时多态)(1)函数重载(FunctionOverloading):函数重载是一种静态多态,允许同一个函数名在同一作用域内具有不同的参数列表。这些不同的版本在编译时......
  • 深入理解 C++ 动态内存管理:new vs malloc
    概述new/delete 是C++的关键字,需要编译器支持。malloc/free 是库函数,需要头文件支持。使用 new 申请内存分配时无需指定内存块大小,编译器会自动计算。而 malloc 需要明确指定所需内存的大小。new 会返回对象类型的指针,类型安全。而 malloc 返回 void*,需要进行强制......
  • 表达式求值--后缀 C++实现
    #include<iostream>#include<string>#include<stack>usingnamespacestd;intPostFixRun(stringch){stack<int>stk;for(inti=0;i<ch.size();i++){if(ch[i]>='0'&&ch[i]<='9')......
  • 线性表总结(数据结构C++,大二下写,初学者)
    这段时间,我学到了这门课的第一种数据结构——线性表。关于线性表的知识,我总结为三方面:课本上学到的知识、上机实现课本上的例子的过程所学到的知识和力扣做题学到的知识和技巧。顺序表线性表中第一个学到的是顺序表,为此我翻了一下课本。顺序表,顾名思义,是线性表的顺序存储结构......
  • C++实现一个简单的计算器
    使用C++创建一个简单的计算器,可以实现+,-,*,/。#include<iostream>usingnamespacestd;intmain(){charop;floatnum1,num2;cout<<"输入运算符:+、-、*、/:";cin>>op;cout<<"输入两个数:";cin&g......
  • C++学习步骤
    学习C++,你可以按照以下步骤进行:1.**基础概念**:  -了解C++的历史和特性。  -学习变量、数据类型(如int,float,char等)和基本运算符。2.**控制结构**:  -条件语句(if,else,switch)  -循环语句(for,while,do-while)3.**函数**:  -函数的定义和调用。......
  • C++Primer Plus 第12章 类和动态内存分配 12.10编程练习第1题new,delete的指向深度拷
    C++PrimerPlus第12章类和动态内存分配12.10编程练习第1题`提示:练习一定要动手操作涉及标准函数及关键词1,new[],delete[],strlen(),strcpy_s(),cout,endl,explicit例如:1,对于下面的类的声明:`提示:设计数组和字符串的new,delete文章目录C++PrimerPlus第12章类......
  • 开源C++静态代码检测工具clang-tidy、cppcheck和oclint的比较
    以下是clang-tidy、cppcheck和oclint的比较关于Clang-Tidy的使用请参考:使用Clang-Tidy进行静态代码分析:完整的配置与CMake集成实例关于Cppcheck的使用请参考:使用Cppcheck进行静态代码分析:完整的shell脚本与CMake集成实例关于OCLint的使用请参考:使用OCLint......