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:指针可以直接当数组使用吗?

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

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

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

相关文章

Linux系统调用read、write

0 前言 《Linux系统调用》整体介绍了系统调用&#xff0c;本文重点分析其中read、write的实现与使用方法。 1 定义 1.1 read SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count) {struct file *file;ssize_t ret -EBADF;int fput_needed;file f…

【前端每日一题】 day3

JS的原型链如何实现继承&#xff0c;请写出一个例子 JavaScript中的原型链继承是通过原型&#xff08;prototype&#xff09;来实现的。每个对象都有一个原型&#xff08;prototype&#xff09;&#xff0c;该原型又是一个对象&#xff0c;而这个对象又有自己的原型&#xff0c…

kubernetes删除命名空间下所有资源

kubernetes强制删除命名空间下所有资源 在 Kubernetes 中&#xff0c;当一个命名空间处于 Terminating 状态但不会完成删除过程时&#xff0c;通常是因为内部资源没有被正确清理。要强制删除这个命名空间及其所有资源&#xff0c;你可以采取以下步骤&#xff1a; 1. 确认命名空…

cPanel中如何卸载已安装的SSL证书

我使用的Hostease的Linux虚拟主机产品默认带普通用户权限的cPanel面板&#xff0c;由于临时搭建了一个测试的个人的纯静态的网站&#xff0c;不想要安装SSL证书&#xff0c;但是据这边了解HosteaseLinux虚拟主机是只要域名解析指向主机IP&#xff0c;并且绑定到主机&#xff0c…

Go 使用mqtt

1、创建一个文件夹&#xff0c;并且使用go modules go mod init <module_name> 其中<module_name>是你的模块名称&#xff0c;如下 go mod init example.com/myproject 2、安装mqtt扩展 go get github.com/eclipse/paho.mqtt.golang 3、开始写主程序 package ma…

中国地面气候资料日值数据获取方式

数据简介 环境气象数据服务平台提供了全国大约2100个点位&#xff0c;2000年至2023年的逐日数据。包括气温、气压、湿度、风、降水等要素。 数据基于ECMWF reanalysis-era5-land、reanalysis-era5-single-levels 以及中国2100站点地面气候资料日值观测数据&#xff0c;使用机器…

BBS客户端服务器的编写

根据网络编程中的内容&#xff0c;我们本篇文章将讲解一个bbs通信的项目&#xff0c;首先让我们了解一下什么是bbs. 一、bbs介绍 BBS&#xff0c;即Bulletin Board System的缩写&#xff0c;中文译为“电子公告板系统”或“网络论坛”。它是一个在网络上进行信息交流和讨论的…

Java解决垂直鉴权问题(对垂直权限进行校验)

Java解决垂直鉴权问题&#xff08;对垂直权限进行校验&#xff09; 文章目录 Java解决垂直鉴权问题&#xff08;对垂直权限进行校验&#xff09;前言一、垂直鉴权是什么&#xff1f;二、实现过程1.新建接口权限菜单映射表2.项目初始化时加载接口菜单映射关系3.自定义过滤器拦截…

[C++][数据结构]哈希2:开散列/哈希桶的介绍和简单实现

前言 接着上一篇文章&#xff0c;我们知道了闭散列的弊端是空间利用率比较低&#xff0c;希望今天学习的开散列可以帮我们解决这个问题 引入 开散列法又叫链地址法(开链法)&#xff0c;首先对关键码集合用散列函数计算散列地址**&#xff0c;具有相同地址的关键码归于同一子…

CMainFrame的OnCreate()函数

在MFC&#xff08;Microsoft Foundation Classes&#xff09;框架中&#xff0c;CMainFrame类通常代表应用程序的主框架窗口。OnCreate()函数是一个非常重要的成员函数&#xff0c;其主要职责是响应WM_CREATE消息。当窗口开始创建时&#xff0c;操作系统会发送这个消息。因此&a…

latex algorithm2e 库学习总结

案例1 \documentclass{article}\usepackage{xeCJK} \usepackage[]{algorithm2e} %\usepackage{ctex} % 中文包\begin{document}\renewcommand{\algorithmcfname}{算法} % 把标题设置为“算法” \begin{algorithm…

离线维护麒麟操作系统

1 本地源设置 a 首先传输一个镜像ISO文件到离线系统。 b 加载镜像文件作为源文件。 #mkdir /mnt/cdrom #mount -o path/镜像.iso /mnt/cdromc 修改源文件 # cd /etc/yum.repo.d/ # vi base.repo 修改baseurl file:///mnt/cdrom d update &install 然后就可以愉快的…

云衔科技成为卓豪Zoho中国区代理商,开启智能化企业管理新篇章

每一家企业数字化转型&#xff0c;都在寻求通过技术创新实现业务的飞跃。为了更好地服务于中国企业的数字化转型需求&#xff0c;云衔科技荣幸宣布正式成为卓豪Zoho中国区代理商&#xff0c;这一强强联合将为市场带来全新的数字化解决方案与服务体验&#xff0c;共同开启中国企…

【代码随想录37期】Day02 有序数组的平方、长度最小的子数组、螺旋矩阵Ⅱ(施工中)

有序数组的平方 977. 有序数组的平方 - 力扣&#xff08;LeetCode&#xff09; v1.0:直接暴力 4分半做出来&#xff0c;用sort api class Solution { public:vector<int> sortedSquares(vector<int>& nums) {vector<int> result;for(int i 0; i<…

鲁教版六年级数学上册-笔记

文章目录 第一章 丰富的图形世界1 生活中的立体图形2 展开和折叠3 截一个几何体4 从三个方向看物体的形状 第二章 有理数及其运算1 有理数2 数轴3 绝对值4 有理数的加法5 有理数的减法6 有理数的加减混合运算7 有理数的乘法8 有理数的除法9 有理数的乘方10 科学计数法11 有理数…

顺序表经典算法OJ题-- 力扣27,88

题1&#xff1a; 移除元素 题2&#xff1a; 合并两个有序数组 一&#xff1a;题目链接&#xff1a;. - 力扣&#xff08;LetCode&#xff09; 思路&#xff1a;&#xff08;双指针法&#xff09; 创建两个变量src&#xff0c;dst 1&#xff09;若src指向的值为val&#xf…

leetcode-字符串的排列-100

题目要求 思路 1.因为只涉及到字符&#xff0c;因此可以进行排序 2.创建临时字符串&#xff0c;当临时字符串temp的长度等于str的长度&#xff0c;作为判出条件。 3.创建一个标记的数组&#xff0c;每次在temp中插入一个字符&#xff0c;便在对应的数组下标设置为1&#xff0c…

国内如何访问 OpenAI 的 api

这个问题甚至我的一些大厂的朋友也不太清楚&#xff0c;所以我觉得有必备写一篇文章来简单盘盘它&#xff0c;希望能帮助到有需要的人 众所周知&#xff0c;由于大陆与 OpenAI 双方互相封锁&#xff0c;大陆是无法直接访问 OpenAI api 的 不过由于 GPT 4 的统治地位&#xff0c…

C++|二叉搜索树

一、二叉搜索树的概念 二叉搜索树又称为二叉排序树&#xff0c;它或者是一颗空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根结…

人工智能绘图工具与设计师的未来发展

随着人工智能技术的不断进步和应用&#xff0c;AI绘图工具如Midjourney等在设计领域的出现引发了广泛的关注和讨论。这些工具号称可以让没有美术基础的人也能快速上手制作出漂亮的图像&#xff0c;给设计师们带来了一些担忧和不确定性。有人担心AI绘图工具会取代设计师的工作&a…