【C++ Primer Plus习题】12.2

news2024/11/15 21:36:42

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

问题:

这里是引用
在这里插入图片描述

解答:
main.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

#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

#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;
}

运行结果:
在这里插入图片描述

考查点:

  • 静态数据成员
  • 静态成员函数
  • 拷贝构造
  • 赋值构造
  • 动态内存分配
  • 析构
  • []下标运算符的重载
  • cctype字母大小写转换
  • 字符串的赋值,拼接和比较
  • 重载<<,>>
  • 友元

注意:

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

2024年9月8日08:52:45

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2115415.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

指针与一维数组

对于数组元素的访问&#xff0c;可以使用下标&#xff0c;也可以使用指针变量&#xff0c;移动指针可以指向数组中的任意一个元素。 例如&#xff0c;一维数组和指针的如下定义 int a [5] {1,2,3,4,5},*p;p a; 因为p是指向一维数组的首元素的指针。因此上述关系等价于 int…

第三天旅游线路规划

第三天&#xff1a;从贾登峪到禾木风景区&#xff0c;晚上住宿贾登峪&#xff1b; 从贾登峪到禾木风景区入口&#xff1a; 1、行程安排 根据上面的耗时情况&#xff0c;规划一天的行程安排如下&#xff1a; 1&#xff09;早上9&#xff1a;00起床&#xff0c;吃完早饭&#…

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录 [web][极客大挑战 2019]Http 考点&#xff1a;Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点&#xff1a;弱密码字典爆破 四种方法&#xff1a; [web][极客大挑战 2019]Http 考点&#xff1a;Referer协议、UA协议、X-Forwarded-For协议 访问…

matlab读取NC文件(含group)

matlab读取NC文件&#xff08;含group&#xff09;&#xff1a; NC文件数据结构&#xff1a; 代码&#xff1a; % 打开 NetCDF 文件 filename your_file.nc; % 替换为你的文件名% 使用 netcdf.open 函数打开文件 ncid netcdf.open(filename, NC_NOWRITE);% 查看文件中的组 …

JAVA - 关于防重复提交探讨

1、前端提交按钮做单次点击 2、后端接收判断请求的数据包&#xff0c;生成唯一key存redis&#xff0c;设置几秒的过期时间&#xff08;缺陷&#xff1a;带时间戳的数据&#xff0c;需要做些逻辑判断&#xff09; 3、后端代码逻辑redis分布式锁&#xff08;缺陷&#xff1a;re…

说一下解除docker限制内存警告

有时候docker要对容器使用的内存做出限制&#xff0c;通常的做法是使用参数 -m 例如&#xff1a; docker run -m 512M表示容器内存最大不能超过512M。 但这样做&#xff0c;在ubuntu会看到以下警告 WARNING: Your kernel does not support swap limit capabilitiesdocker官方…

ELK笔记

要搞成这样就需要钱来买服务器 开发人员一般不会给服务器权限&#xff0c;不能到服务器上直接看日志&#xff0c;所以通过ELK看日志。不让开发登录服务器。即使你查出来是开发的问题&#xff0c;费时间&#xff0c;而且影响了业务了&#xff0c;就是运维的问题 开发也不能登录…

从零开始学习JVM(七)- StringTable字符串常量池

1 概述 String应该是Java使用最多的类吧&#xff0c;很少有Java程序没有使用到String的。在Java中创建对象是一件挺耗费性能的事&#xff0c;而且我们又经常使用相同的String对象&#xff0c;那么创建这些相同的对象不是白白浪费性能吗。所以就有了StringTable这一特殊的存在&…

用EA和SysML一步步建模(05)使命声明-解构需求01

用EA和SysML一步步建模的操作指南&#xff08;01&#xff09; 用EA和SysML一步步建模&#xff08;02&#xff09;导入ISO-80000 用EA和SysML一步步建模&#xff08;03&#xff09;创建包图和包的关系 用EA和SysML一步步建模&#xff08;04&#xff09;创建“需求组织”包图 …

【PHPStudy搭建Pikachu靶场】自定义网站站点和mysql端口本地搭建Pikachu靶场

文章目录 1. 下载phpstudy和pikaqu源码2. 打开phpstudy&#xff0c;启用apache和mysql3. Phpstudy用自定义的82端口创建网站4. 创建数据库5. 修改apache的端口和网站根目录6. 修改mysql的端口和服务序列号7. 用浏览器打开靶场8. 修改pikachu的config.inc.php文件9. 在浏览器上打…

一些硬件知识(十八)

两个信号PIN之间串接电阻的作用&#xff1a; 1.阻抗匹配 2.吸收反射 3.防止程序异常导致两个IO都是输出的时候短路 尤其针对下图中的信号&#xff1a; 清理穿越机电机中的灰尘&#xff0c;可以用密封胶泥的办法&#xff1a; 一定要小心垫片的掉落&#xff1a; 20块左右的快充充…

魔术方法介绍

目录 一、基本介绍 1、什么是魔术方法 2、常见的魔术方法 二、__str__ 1、基本介绍 2、应用实例&#xff1a;请输出Monster对象的属性信息 三、__eq__ 1、基本介绍 2、应用实例 四、其它几个魔术方法 1、其它魔术方法 2、应用实例 参考文档&#xff1a;3. 数据模型…

SOMEIP_ETS_096: SD_Check_TCP_Connection_before_SubscribeEventgroup

测试目的&#xff1a; 验证DUT&#xff08;Device Under Test&#xff09;在未事先建立TCP连接的情况下&#xff0c;对于包含TCP端点选项的SubscribeEventgroup请求&#xff0c;能够拒绝该请求并发送SubscribeEventgroupNAck。 描述 本测试用例旨在确保DUT遵循SOME/IP协议&a…

堆排序Java

思路 这个代码还不错 https://blog.csdn.net/weixin_51609435/article/details/122982075 就是从下往上进行调整 1. 如何将数组映射成树 对于下面这颗树&#xff0c;原来的数组是&#xff1a; 好&#xff0c;如果调整的话&#xff0c;我们第一个应该调整的是最下边&#x…

JVM面试真题总结(三)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 解释-下Full GC? Full GC&#xff0c;也被称为Major GC&#xff…

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操…

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节&#xff0c;字符串小于等于15直接保存在栈上&#xff0c;超过之后才会使用new分配。

网络学习-eNSP配置多交换机VLAN

实验环境 通过华为eNSP软件实现 1.两台S3700交换机 2.四台电脑PC1&#xff1a;192.168.0.1PC2&#xff1a;192.168.0.2PC3&#xff1a;192.168.0.3PC4&#xff1a;192.168.0.4PC11&#xff1a;192.168.0.11PC22&#xff1a;192.168.0.22PC33&#xff1a;192.168.0.33PC44&…

SpringBoot开启多端口探究--基于多ApplicationContext

文章目录 前情提要一、思路概要二、具体实现三、其他问题父子关系部分依赖 总结 前情提要 前面探讨了management端口开启&#xff0c;grpc端口开启&#xff0c;本文继续探讨在SpringApplication中开启多个端口的方式之多ApplicationContext, 相比management端口基于多WebServe…

AI绘画工具排行榜:探索最受欢迎的AI绘图软件特点与选择指南

AI绘画工具各有优势&#xff0c;从开放性到对特定语言和文化的支持&#xff0c;以及对图像细节和艺术性的不同关注点&#xff0c;根据具体需求选择合适的工具 MidJourney 图片品质卓越&#xff0c;充满独特创意&#xff0c;初期能够免费获取数十账高质量图片&#xff0c;整个生…