当前位置: 首页 > news >正文

C++ primer plus习题及解析第十二章(类和动态内存分配)

题目:12.1

题: 对于下面的类声明:

class Cow
{
private:char name[20];char* hobby;double weight;
public:Cow();Cow(const char* nm, const char* ho, double wt);//有参构造Cow(const Cow& c);//拷贝构造函数~Cow();//析构函数Cow& operator=(const Cow& c);void ShowCow() const;//展示信息};

给这个类提供实现,并编写一个使用所有成员函数的小程序。 

class Cow
{
private:char name[20];char* hobby;double weight;
public:Cow();Cow(const char* nm, const char* ho, double wt);//有参构造Cow(const Cow& c);//拷贝构造函数~Cow();//析构函数Cow& operator=(const Cow& c);void ShowCow() const;//展示信息};Cow::Cow()
{cout << "构造函数!!!" << endl;
}
Cow::Cow(const char* nm, const char* ho, double wt)//有参构造
{strcpy_s(this->name, nm);//拷贝//hobby和ho都是指针,最好给其分配地址了,在进行赋值int len = sizeof(ho) / sizeof(ho[0]);hobby = new char[len+1];hobby[len] = '\0';strcpy_s(hobby,len, ho);this->weight = wt;
}
Cow::Cow(const Cow& c)//拷贝构造函数
{//将c中所有的值都拷贝到主体中strcpy_s(this->name, c.name);//指针不能直接赋值,不安全int len = sizeof(c.hobby) / sizeof(c.hobby[0]);this->hobby = new char[len + 1];strcpy_s(this->hobby,len, c.hobby);hobby[len] = '\0';this->weight = c.weight;}
Cow::~Cow()//析构函数
{delete[] hobby;hobby = nullptr;cout << "析构函数!!!" << endl;
}
Cow& Cow::operator=(const Cow& c)
{//等号赋值操作,这也是拷贝strcpy_s(this->name, c.name);int len = sizeof(c.hobby) / sizeof(c.hobby[0]);this->hobby = new char[len + 1];strcpy_s(this->hobby, len, c.hobby);hobby[len] = '\0';this->weight = c.weight;return *this;
}
void Cow::ShowCow() const//展示信息
{cout << "name=" << this->name << endl;cout << "hobby=" << this->hobby << endl;cout << "weight=" << this->weight << endl;
}
void Func()
{Cow a;//无参构造函数Cow b("牛1", "吃草", 200.0);//有参构造b.ShowCow();cout << "---------------------------------" << endl;Cow c(b);//拷贝构造函数c.ShowCow();cout << "---------------------------------" << endl;Cow e;e = b;//等号重载e.ShowCow();
}

问题1:Cow(const char* nm, const char* ho, double wt),前两各参数接收的是什么?

 前两个参数接收的是指向字符数组的指针。

 问题2:类中的this是指向本体的指针吗?

是的,this指针是一个隐含的指向当前对象的指针,它指向调用成员函数的对象本体。在类的成员函数中,可以使用this指针来访问对象的成员变量和成员函数。

问题3:char*hobby这个成员指针,为什么输出时候直接用cout<<this->hobby;

 在C++中,char*类型的指针通常指向一个以null结尾的字符串数组。当直接使用cout输出一个char*指针时,cout会输出指针所指向的字符串,直到遇到null终止符为止。因此,当你使用cout << this->hobby;时,实际上是输出了this->hobby所指向的字符串。这种行为是C++中的一种约定俗成的用法,但需要注意确保指针指向的字符串是以null结尾的,否则可能导致未定义的行为。

题目:12.2

题: 通过完成下面的工作来改进String类声明(即将String1.h升级为String2.h)。

a.对+运算符进行重载,使之可将两个字符串合并成1个。

b.提供一个Stringlow( )成员函数,将字符串中所有的字母字符转 换为小写(别忘了cctype系列字符函数)。

c.提供String( )成员函数,将字符串中所有字母字符转换成大写。 d.提供一个这样的成员函数,它接受一个char参数,返回该字符在字符串中出现的次数。使用下面的程序来测试您的工作:

class String2
{
private:string ans;public:String2();//无参构造函数String2(const string name);//有参构造函数String2 operator=(const String2 object);//重载等号操作String2 operator+(const String2 object);//重载加号操作void Stringlow();//将字符转化为小写字母void Stringup();//将字符转化为大写字母int  String_Count(char c);//返回该字符在字符串中出现的次数。void Print_String();//打印字符~String2();//析构函数};
#include "String2.h"String2::String2()//无参构造函数
{cout << "无参构造函数!!!" << endl;
}String2::String2(const string name)//有参构造函数
{this->ans = name;
}String2 String2::operator=(const String2 object)//重载等号操作
{//就是进行拷贝this->ans = object.ans;return *this;
}String2 String2::operator+(const String2 object)//重载加号操作
{this->ans = this->ans + object.ans;return *this;
}void String2::Stringlow()//将字符转化为小写字母
{string::iterator it = this->ans.begin();for (it; it != this->ans.end(); it++){*it=tolower(*it);}
}void String2::Stringup()//将字符转化为大写字母
{string::iterator it = this->ans.begin();for (it; it != ans.end(); it++){*it = toupper(*it);}}int  String2::String_Count(char c)//返回该字符在字符串中出现的次数。
{int count = 0;string::iterator it = this->ans.begin();for (it; it != ans.end(); it++){if (*it == c){count++;}}return count;
}String2::~String2()//析构函数
{cout << "析构函数!!!" << endl;
}void String2::Print_String()//打印字符
{cout << this->ans << endl;
}

 问题1:c++如何大小写字母如何进行转化。

#include <iostream>
#include <cctype>int main() {//转化成小写用tolower()char uppercaseLetter = 'A';char lowercaseLetter = tolower(uppercaseLetter);std::cout << "Uppercase letter: " << uppercaseLetter << std::endl;std::cout << "Lowercase letter: " << lowercaseLetter << std::endl;//转化成大写用toupper()char lowercaseLetter = 'a';char uppercaseLetter = toupper(lowercaseLetter);std::cout << "Lowercase letter: " << lowercaseLetter << std::endl;std::cout << "Uppercase letter: " << uppercaseLetter << std::endl;return 0;
}

题目:12.2(优化)

#pragma once
#ifndef STRING2_H_
#define STRING2_H_
#include<iostream>
using namespace std;class String2
{
private:char* str;//指向数组的指针int chars;//字符数组大小static int strings;//创建了类的个数public:String2();//无参构造函数String2(const String2& s);//拷贝构造函数String2(const char* ps);//也是赋值的一种,大多要使用strcpy_s()~String2();//析构函数int numstrings();int len();void stringup();//转化成大写字母void stringlow();//转化成小写字母int has(char c);//应该是包含字符数量String2& operator=(const String2& s);//重载等号void Show_String2();//显示String2中的信息};#endif // !STRING2_H_/*
这段代码是用来防止头文件的重复包含的。当一个头文件被包含多次时,
为了避免重复定义,可以使用这种方式来保护头文件内容只被包含一次。
当第一次包含头文件时,STRING2_H_会被定义,之后再次包含时,STRING2_H_已经被定义,
就不会再次包含头文件内容。这样可以避免出现重复定义的错误。
*/
#include "String2.h"
int String2::strings = 0;//对私有变量进行初始化String2::String2()//无参构造函数
{this->str = NULL;this->chars = 0;this->strings++;cout << "无参构造函数!!!" << endl;
}String2::String2(const String2& s)//拷贝构造函数
{//用实例进行赋值this->chars = s.chars;//为str申请空间str = new char[chars + 1];strcpy_s(str, this->chars,s.str);//拷贝给strstr[chars] = '\0';//结束标识符strings++;//实例化个数加一}String2::String2(const char* ps)//也是赋值的一种,大多要使用strcpy_s()
{//传入的必然是一个数组int len = strlen(ps);//为str申请空间this->str = new char[len + 1];strcpy_s(str, len+1, ps);str[len] = '\0';this->chars = len;this->strings++;
}String2::~String2()//析构函数
{strings--;delete[]str;//删除所有申请的空间
}int String2::numstrings()
{return strings;
}int String2::len()
{return this->chars;
}void String2::stringup()//转化成大写字母
{for (int i = 0; i < this->chars; i++){this->str[i] = toupper(str[i]);}
}void String2::stringlow()//转化成小写字母
{for (int i = 0; i < this->chars; i++){this->str[i] = tolower(str[i]);}
}int String2::has(char c)//应该是包含字符数量
{int count = 0;for (int i = 0; i < this->chars; i++){if (this->str[i] == c){count++;}}return count;
}String2& String2::operator=(const String2& s)//重载等号
{//本质上也是拷贝/*int len = strlen(s.str);this->str = new char[len + 1];strcpy_s(this->str, len, s.str);str[len] = '\0';this->chars = s.chars;this->strings = s.strings;return *this;*///上面的想的简单了if (this == &s)return *this;//如果直接相同了,那就不用进行赋值操作了delete[] str;//删除原来的旧值chars = s.chars;str = new char[chars + 1];strcpy_s(this->str, this->chars, s.str);this->strings = s.strings;return *this;
}void String2::Show_String2()
{cout << "str:";for (int i = 0; i < this->chars; i++){cout << str[i];}cout << endl;cout << "chars:";cout << this->chars << endl;cout << "strings:";cout << this->strings << endl;cout << endl;
}

问题1:指针可以直接当数组使用吗?

指针可以直接当数组使用,因为数组名本身就是一个指向数组首元素的指针。可以通过指针来访问数组中的元素,也可以通过指针进行数组的遍历和操作。但是需要注意的是,指针和数组是不同的类型,指针可以指向数组,但数组本身并不是指针。

相关文章:

C++ primer plus习题及解析第十二章(类和动态内存分配)

题目&#xff1a;12.1 题&#xff1a; 对于下面的类声明&#xff1a; class Cow { private:char name[20];char* hobby;double weight; public:Cow();Cow(const char* nm, const char* ho, double wt);//有参构造Cow(const Cow& c);//拷贝构造函数~Cow();//析构函数Cow&…...

gdb调试功能描述

gdb调试功能描述 gdb 调试&#xff1a;只对可执行文件进行调用&#xff0c;无法直接用gdb调试.c文件 1.查找命令帮助&#xff1a; &#xff08;gdb&#xff09; help data &#xff08;gdb&#xff09; help call -l (list) 查看载入文件&#xff08;默认为10行&#xff09…...

使用Simulink Test进行单元测试

本文摘要&#xff1a;主要介绍如何利用Simulink Test工具箱&#xff0c;对模型进行单元测试。内容包括&#xff0c;如何创建Test Harness模型&#xff0c;如何自动生成excel格式的测试用例模板来创建测试用例&#xff0c;如何手动填写excel格式的测试用例模板来手动创建测试用例…...

深度学习中超参数设置

1、batchsize 在训练深度学习模型时&#xff0c;batch size&#xff08;批大小&#xff09;和 epochs&#xff08;迭代次数&#xff09;之间的关系取决于您的数据集大小、模型复杂度、计算资源等因素。下面是一些一般性的指导原则&#xff1a; 较大的 Batch Size&#xff1a;通…...

Docker nsenter 命令使用

查看容器对应宿主机上面的pid&#xff0c;容器技术的实质是进程&#xff0c;并没有完整的操作系统&#xff0c;就相当于在主机上面fork了一个子进程&#xff0c;通过docker daemon去fork一个子进程&#xff0c;这个子进程是可以在主机上面看到其pid的。 $ docker inspect -f {…...

十二种网络威胁防护方案

一、SQL注入 SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严&#xff0c;攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句&#xff0c;在管理员不知情的情况下实现非法操作&#xff0c;以此来实现欺骗数据库服务器执行非授权的任…...

C++ sort()排序详解

头文件 在C中使用sort()函数需要使用#include<algorithm> sort()基本使用方法 sort()函数可以对给定区间所有元素进行排序。它有三个参数sort(begin, end, cmp) 其中begin为指向待sort()的数组的第一个元素的指针&#xff0c;end为指向待sort()的数组的最后一个元素的…...

移动机器人系统与技术:自动驾驶、移动机器人、旋翼无人机

这本书全面介绍了机器人车辆的技术。它介绍了道路上自动驾驶汽车所需的概念。此外&#xff0c;读者可以在六足机器人的构造、编程和控制方面获得宝贵的知识。 这本书还介绍了几种不同类型旋翼无人机的控制器和空气动力学。它包括各种旋翼推进飞行器在不同空气动力学环境下的模…...

zTasker v1.88.1一键定时自动化任务

软件介绍 zTasker是一款完全免费支持定时、热键或条件触发的方式执行多种自动化任务的小工具&#xff0c;支持win7-11。其支持超过100种任务类型&#xff0c;50种定时/条件执行方法&#xff0c;而且任务列表可以随意编辑、排列、移动、更改类型&#xff0c;支持任务执行日志&a…...

时序医疗数据集---adfecgdb

数据集简介 该数据库包含了在波兰西里西亚医科大学妇产科&#xff0c;通过使用KOMPOREL系统收集的5位临产孕妇&#xff08;孕38至41周&#xff09;的多通道胎儿心电图&#xff08;FECG&#xff09;记录。这些记录通过腹部四个电极和安置在胎儿头部的直接心电图电极同步收集&am…...

ruoyi-vue-pro 使用记录(4)

ruoyi-vue-pro 使用记录&#xff08;4&#xff09; CRM数据库线索客户商机合同回款产品其他 CRM 文档 主要分为 6 个核心模块&#xff1a;线索、客户、商机、合同、回款、产品。 线索管理以 crm_clue 作为核心表客户管理以 crm_customer 作为核心表商机管理以 crm_business 作…...

【17-Ⅱ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础&#xff0c;通过阅读Java廖雪峰网站&#xff0c;简单速成了java&#xff0c;但对其中一些入门概念有所疏漏&#xff0c;阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…...

订单超时自动取消的实践方案

1、定时任务方案 方案流程&#xff1a; 每隔 30 秒查询数据库&#xff0c;取出最近的 N 条未支付的订单。 遍历查询出来的订单列表&#xff0c;判断当前时间减去订单的创建时间是否超过了支付超时时间&#xff0c;如果超时则对该订单执行取消操作。 定时任务方案工程实现相…...

【gin框架入门】

1.介绍 Gin 是一个用 Golang编写的 高性能的web 框架, 由于http路由的优化&#xff0c;速度提高了近 40 倍。 Gin的特点就是封装优雅、API友好。 Gin的一些特性&#xff1a; 快速 基于 Radix 树的路由&#xff0c;小内存占用。没有反射。可预测的 API 性能。 支持中间件 传入…...

dev c++调试录入数字后回车直接关闭

1、我的dev c版本是5.11 2、输入7后&#xff0c;回车就没有了&#xff0c;原因是1013,1.cpp未包含在项目中 3、新建项目&#xff0c;并将test_debug.cpp包含在项目内&#xff0c;就可以下断点调试了...

java期末复习

java jdk jre jvm .java-------->.class----jvm---->机器语言 编写源文件 编译源文件生成字节码 加载运行字节码 java语句执行顺序 顺序 选择 循环 异常处理 基本语法 方法格式 权限修饰符 返回值声明 方法名称(参数列表){方法中封装的逻辑功能;return 返回值;}–权…...

让新手变中手的ChatGPT 使用方法

让新手变中手的ChatGPT 使用方法 已经要一年了,没想到这篇还是一样有用。看到许多依然是一句话就要问出结果的教学,就知道AI 进步很快,但人的学习速度还需要更多时间。 以下为去年原版内容加上新的两招更新,希望帮助你使用ChatGPT 更好用,当未来文字可直接生成影像时,你…...

桥接模式类图与代码

欲开发一个绘图软件&#xff0c;要求使用不同的绘图程序绘制不同的图形。以绘制直线和圆形为例&#xff0c;对应的绘图程序如表 7.7 所示。 根据绘图软件的扩展性要求&#xff0c;该绘图软件将不断扩充新的图形和新的绘图程序。为了避免出现类爆炸的情况&#xff0c;现采用桥接…...

Oracle count的优化-避免全表扫描

Oracle count的优化-避免全表扫描 select count(*) from t1; 这句话比较简单&#xff0c;但很有玄机&#xff01;对这句话运行的理解&#xff0c;反映了你对数据库的理解深度&#xff01; 建立实验的大表他t1 SQL> conn scott/tiger 已连接。 SQL> drop table t1 purge…...

leetcode17. 电话号码的字母组合

题目描述&#xff1a; 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits "…...

如何设计与管理一个前端项目

目录 前端项目设计 前端项目搭建 洞察项目瓶颈 方案调研与选型对比 前端项目管理 合理的分工排期 风险把控 及时反馈与复盘 结束语 如果说基础知识的掌握是起跑线&#xff0c;那么使大家之间拉开差距的更多是前端项目开发经验和技能。对于一个项目来说&#xff0c;从框…...

【MQTT】mosquitto 的 “下载、交叉编译、使用” 详细教程,手把手搭建一个MQTT Broker

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-05-11 0…...

用云手机打造海外社媒矩阵

在全球经济一体化的大背景下&#xff0c;中国出海企业及B2B外贸公司正将海外社交媒体营销作为重要的市场拓展策略。为更好地触及不同受众群体&#xff0c;构建跨平台的社媒矩阵已成为企业营销的关键步骤。本文将探讨如何利用云手机技术&#xff0c;高效管理并运营多个海外社交媒…...

第 8 章 机器人平台设计之底盘实现(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 8.4.1 底盘实现_概述 1.ros_arduino_bridge 简介 该功能包包含Arduino库和用来控制Arduino的ROS驱动包&…...

✔ ★Java项目——设计一个消息队列(五)【虚拟主机设计】

虚拟主机设计 创建 VirtualHost实现构造⽅法和 getter创建交换机删除交换机创建队列删除队列创建绑定删除绑定发布消息 ★路由规则1) 实现 route ⽅法2) 实现 checkRoutingKeyValid3) 实现 checkBindingKeyValid4) 实现 routeTopic5) 匹配规则测试⽤例6) 测试 Router 订阅消息1…...

ntfs文件系统的优势 NTFS文件系统的特性有哪些 ntfs和fat32有什么区别 苹果电脑怎么管理硬盘

对于数码科技宅在新购得磁盘之后&#xff0c;出于某种原因会在新的磁盘安装操作系统。在安装操作系统时&#xff0c;首先要对磁盘进行分区和格式化&#xff0c;而在此过程中&#xff0c;操作者们需要选择文件系统。文件系统也决定了之后操作的流程程度&#xff0c;一般文件系统…...

Python Web框架Django项目开发实战:创建在线学习应用

注意&#xff1a;本文的下载教程&#xff0c;与以下文章的思路有相同点&#xff0c;也有不同点&#xff0c;最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程&#xff1a;Python项目开发Django实战-创建在线学习应用-编程案例解析实例详解课程教程.pdf 在当今数字化教…...

用得助全媒体呼叫中心,让AI落到实处帮品牌做营销

怎么让人工智能落到实处的帮助到我们&#xff1f;我们今天来讲讲中关村科金得助全媒体呼叫中心是怎么让AI帮品牌。 这次聊的案例是知名的护肤品牌&#xff0c;该品牌在中国功能性护肤品市场占有率达到20.5%&#xff0c;这么高的市场占有率客户的咨询量也是非常庞大的&#xff0…...

【吃透Java手写】2-Spring(下)-AOP-事务及传播原理

【吃透Java手写】Spring&#xff08;下&#xff09;AOP-事务及传播原理 6 AOP模拟实现6.1 AOP工作流程6.2 定义dao接口与实现类6.3 初始化后逻辑6.4 原生Spring的方法6.4.1 实现类6.4.2 定义通知类&#xff0c;定义切入点表达式、配置切面6.4.3 在配置类中进行Spring注解包扫描…...

Spring原理分析--获取Environment资源对象

1.使用getEnvironment()获取环境信息 ApplicationContext接口继承了EnvironmentCapable接口&#xff0c;可以通过getEnvironment()获取Environment配置信息&#xff0c;例如&#xff1a; SpringBootApplication public class A01 {public static void main(String[] args) th…...