【C++ Primer Plus习题】12.2

大家好,这里是国中之林!
❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看←

问题:


解答:

main.cpp

cpp 复制代码
#include <iostream>
#include "String.h"
using namespace std;

int main()
{
	String s1(" and I am a C++ student.");
	String s2 = "Please enter your name: ";
	String s3;
	cout << s2;
	cin >> s3;
	s2 = "My name is " + s3;
	cout << s2 << ".\n";
	s2 = s2 + s1;
	s2.stringup();
	cout << "The string\n" << s2 << "\ncontains " << s2.has('A') << " 'A' characters in it.\n";
	s1 = "red";
	String rgb[3] = { String(s1),String("green"),String("blue") };
	cout << "Enter the name of a primary color for mixing light: ";
	String ans;
	bool success = false;
	while (cin >> ans)
	{
		ans.stringlow();
		for (int i = 0; i < 3; i++)
		{
			if (ans == rgb[i])
			{
				cout << "That's right!\n";
				success = true;
				break;
			}
		}
		if (success)break;
		else cout << "Try again!\n";
	}
	cout << "Bye!" << endl;
	return 0;


	return 0;
}

String.h

cpp 复制代码
#pragma once
#include <iostream>
using namespace std;

class String
{
private:
	char* str;
	int len;
	static int num_strings;
	static const int CINLIM = 80;
public:
	String();
	String(const char*s);
	String(const String&s);
	~String();
	int lengh()const { return len; }

	String& operator=(const String&s);
	String& operator=(const char*s);

	char& operator[](int i);
	const char& operator[](int i)const;



	void stringup();
	void stringlow();
	int has(char c);

	String operator+(const String& s);
	bool operator==(const String& s);

	friend bool operator<(const String& st1, const String& st2);
	friend bool operator>(const String& st1, const String& st2);
	friend ostream& operator<<(ostream& os, const String& s);
	friend istream& operator>>(istream& is, String& s);
	friend String operator+(const char* c, const String& s);

	static int HowMany();
};

String.cpp

cpp 复制代码
#include "String.h"
#include <cctype>

int String::num_strings = 0;

int String::HowMany()
{
	return num_strings;
}

String::String()
{
	//str = NULL;
	//len = 0;
	len = 4;
	str = new char[1];
	str[0] = '\0';
	num_strings++;
}
String::String(const char* s)
{
	len = strlen(s);
	str = new char[len+1];
	strcpy_s(str, len+1, s);
	num_strings++;
}

String::String(const String&s)
{
	len = s.len;
	str = new char[len + 1];
	strcpy_s(str, len + 1, s.str);
	num_strings++;
}

String::~String()
{
	--num_strings;
	delete[] str;
}

String& String::operator=(const String& s)
{
	if (this == &s)return *this;
	if (str)delete[] str;
	len = s.len;
	str = new char[len + 1];
	strcpy_s(str, len + 1, s.str);
	return *this;
}

String& String::operator=(const char* s)
{
	if (str)delete[] str;
	len = strlen(s);
	str = new char[len + 1];
	strcpy_s(str, len + 1, s);
	return *this;
}

char& String::operator[](int i)
{
	return str[i];
}
const char& String::operator[](int i)const
{
	return str[i];
}

void String::stringup()
{
	for (int i = 0; i < len;i++)
	{
		str[i] = toupper(str[i]);
	}
}
void String::stringlow()
{
	for (int i = 0; i < len; i++)
	{
		str[i] = tolower(str[i]);
	}
}
int String::has(char c)
{
	int count = 0;
	for (int i = 0; i < len; i++)
	{
		if (str[i] == c)
		{
			count++;
		}
	}
	return count;
}

String String::operator+(const String& s)
{
	/*if (!s.str || !str)return String();
	int size = strlen(s.str) + strlen(str) + 1;
	char* result = new char[size];
	strcpy_s(result, strlen(str) + 1, str);
	strcat_s(result,size, s.str);

	return String(result);*/

	String result;
	result.len = s.len + len;
	result.str = new char[result.len + 1];
	strcpy_s(result.str, result.len+1 ,str);
	strcat_s(result.str, result.len + 1, s.str);
	return result;
}

bool operator<(const String& st1, const String& st2)
{
	return strcmp(st1.str, st2.str) < 0;
}
bool operator>(const String& st1, const String& st2)
{
	return st2 < st1;
}
bool String::operator==(const String& s)
{
	bool flag = false;
	for (int i = 0; i < len; i++)
	{
		if (str[i] == s.str[i])
		{
			flag = true;
		}
		else
		{
			return false;
		}	
	}
	return flag;
}

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

//istream& operator>>(istream& is, String& s)
//{
//	char* str=NULL;
//	is >> str;
//	s.str = new char[strlen(str) + 1];
//	strcpy_s(s.str, strlen(str) + 1, str);
//	return is;
//}

istream& operator>>(istream& is, String& s) {
	char buffer[256]; // 使用一个临时缓冲区  
	//is >> buffer; // 读取输入到缓冲区 
	is.getline(buffer, 256);

	// 释放之前的内存(如果有)  
	delete[] s.str;

	// 分配新的内存并复制字符串  
	s.len = strlen(buffer);
	s.str = new char[strlen(buffer) + 1];
	strcpy_s(s.str, strlen(buffer) + 1, buffer); // 使用 strcpy_s 进行安全复制  

	/*char temp[String::CINLIM];
	is.get(temp, String::CINLIM);
	if (is)
	{
		s = temp;
	}
	while (is && is.get() != '\n')continue;*/

	return is;
}

String operator+(const char* c, const String& s)
{
	/*String temp;
	int size = strlen(c) + strlen(s.str) + 1;
	char* result = new char[size];
	strcpy_s(result, size, c);
	strcat_s(result,size, s.str);
	temp.len = size;
	temp.str = new char(size);
	strcpy_s(temp.str, size, result);*/
	String temp;
	temp.len = s.len + strlen(c);
	temp.str = new char[temp.len + 1];
	strcpy_s(temp.str,temp.len+1, c);
	strcat_s(temp.str, temp.len + 1, s.str);
	return temp;
}

运行结果:

考查点:

  • 静态数据成员
  • 静态成员函数
  • 拷贝构造
  • 赋值构造
  • 动态内存分配
  • 析构
  • \]下标运算符的重载

  • 字符串的赋值,拼接和比较
  • 重载<<,>>
  • 友元

注意:

  • 有指针的数据成员类,一定要深拷贝!

2024年9月8日08:52:45

相关推荐
待什么青丝40 分钟前
【linux】驱动学习问题及解决方法
linux·数据库·学习
派阿喵搞电子1 小时前
学习昇腾开发的第二天--PC机远程登录开发板
学习·昇腾
byte轻骑兵1 小时前
【C++特殊工具与技术】优化内存分配(五):显式析构函数的调用
开发语言·c++
黑听人1 小时前
【力扣 简单 C】141. 环形链表
c语言·开发语言·数据结构·算法·leetcode
谷雨不太卷2 小时前
AVL树的实现
数据结构·c++·算法
Blossom.1182 小时前
基于深度学习的智能图像分类系统:从零开始构建
开发语言·人工智能·python·深度学习·神经网络·机器学习·分类
缘友一世2 小时前
java设计模式[2]之创建型模式
java·开发语言·设计模式
cyc&阿灿3 小时前
Java中extends与implements深度解析:继承与接口实现的本质区别
java·开发语言
别来无恙1494 小时前
岛屿周长问题的三种解法:直接计数法、数学计算法与深度优先搜索
java·c++·算法·深度优先·dfs
虾条_花吹雪4 小时前
5、Spring AI(MCPServer+MCPClient+Ollama)开发环境搭建_第一篇
数据库·人工智能·学习·spring·ai