C++笔记:实现一个字符串类(构造函数、拷贝构造函数、拷贝赋值函数)

实现一个字符串类String,为其提供可接受C风格字符串的构造函数、析构函数、拷贝构造函数和拷贝赋值函数。

声明依赖文件

其中ostream库用于打印标准输入输出,cstring库为C风格的字符串库

#include <iostream>
#include <cstring>

声明命名空间 

using namespace std;

构造String类

声明私有的字符串指针成员

private:char * str;

C风格构造函数

构造函数的参数为const类型的字符串指针。

构造函数的内容根据字符串的长度来向堆申请空间,随后将str的字符串内容拷贝给strcpy。

String(const char *str)
{this->str = new char[strlen(str) + 1];strcpy(this->str,str);
}

拷贝构造函数

参数为String类对象的引用,根据对象的str的长度来向堆申请空间,随后将str的字符串内容拷贝给strcpy。

String(const String&that)
{str = new char[strlen(that.str) + 1];strcpy(str,that.str);
}

深拷贝赋值函数 

当两对象进行赋值操作时,比如“i2=i1”编译器会将其处理为“i2.operator=(i1) 的成员函数调用形式”,

其中“operator=”称为拷贝赋值操作符函数,由该函数完成赋值运算,返回结果就是表达式的结果。

如果没有自己定义拷贝赋值操作符函数,编译器会为该类提供缺省的拷贝赋值操作符函数,用于完成两个对象的赋值操作。

但是编译器提供的缺省拷贝赋值函数,和缺省拷贝构造函数类似,也是浅拷贝,有“double free”和“内存泄漏”的问题,这时需要自定义深拷贝赋值函数

String & operator = (const String & that)
{if(this != &that){/*释放掉this对象原来的堆空间*/delete [] str;str = new char[strlen(that.str) + 1];strcpy(str,that.str);}return *this;
}

完整代码

class String
{
public:String(const char *str){this->str = new char[strlen(str) + 1];strcpy(this->str,str);}String(const String&that){str = new char[strlen(that.str) + 1];strcpy(str,that.str);}void print(void){cout << str << endl;}String & operator = (const String & that){if(this != &that){/*释放掉this对象原来的堆空间*/delete [] str;str = new char[strlen(that.str) + 1];strcpy(str,that.str);}return *this;}~String(){delete []str;}const char * c_str(){return str;}
private:char * str;
};

测试

接下来编写main函数进行测试。

int main(void)
{String s1 = "hello";s1.print();String s2 = s1;s2.print();String s3 = "world";s2 = s3;s2.print();cout << s3.c_str() << endl;return 0;
}

s2在构造时调用拷贝构造函数 ,所以先打印为hello,

后面进行了s2=s3,为深拷贝构造函数,s2的str成员内容变为"world\0"。

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

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

相关文章

基于lio-sam的重定位和增量式建图

文章目录 遇到的问题解决思路预览效果详细过程预先构建地图订阅初始估计姿态加载全局地图ICP配准计算初始位姿参考遇到的问题 为了复用上个生命周期录制的轨迹,我需要用到重定位功能,现有的开源方案中,可以实现该功能,但存在以下问题:在预先构建的地图之外,无法实现定位…

车辆轨迹预测系列 (五):Argoverse API Forecasting Tutorial代码解析

车辆轨迹预测系列 (五)&#xff1a;Argoverse API Forecasting Tutorial代码解析 文章目录 车辆轨迹预测系列 (五)&#xff1a;Argoverse API Forecasting Tutorial代码解析一、argoverse.data_loading.argoverse_forecasting_loader二、argoverse.visualization.visualize_seq…

标准版小程序订单中心path审核不通过处理教程

首先看自己小程序是不是已经审核通过并上线状态才在站内信里面提醒的&#xff1f; 如果没有提交过审核&#xff0c;请在提交的时候填写。path地址为&#xff1a;pages/goods/order_list/index 如果是已经上线的小程序&#xff0c;当时没要求填这个&#xff0c;但新的政策要求填…

深度学习 --- stanford cs231学习笔记七(训练神经网络之梯度下降优化器)

5&#xff0c;梯度下降优化器 5&#xff0c;1 梯度下降在深度学习中的作用 在深度学习中&#xff0c;权重W的值是否合理是由损失函数L来判断的。L越小&#xff0c;表示W的设置越happy。L越大&#xff0c;表示W的值越unhappy。 为了让L越来越小&#xff0c;常用的方法是梯度下降…

华为5288 V5服务器安装BCLinux8U4手记

本文记录了华为5288 V5服务器安装BCLinux8U4操作系统的过程。 一、系统环境 1、服务器 华为FusionServer Pro 5288 V5服务器 2、操作系统 BCLinux-R8-U4-Server-x86_64-220725.iso 官网下载地址 sha256sum&#xff1a;1d31d3b8e02279e89965bd3bea61f14c65b9d32ad2ab6d4eb…

【PyTorch函数解析】einsum的用法示例

一、前言 einsum 是一个非常强大的函数&#xff0c;用于执行张量&#xff08;Tensor&#xff09;运算。它的名称来源于爱因斯坦求和约定&#xff08;Einstein summation convention&#xff09;&#xff0c;在PyTorch中&#xff0c;einsum 可以方便地进行多维数组的操作和计算…

GPT-5:AI新纪元的领航者,多维度的审视与准备

一、引言&#xff1a;GPT-5与AI的多维演进 GPT-5作为AI领域的里程碑式突破&#xff0c;不仅仅代表了技术的飞跃&#xff0c;更预示着社会、文化以及经济等多个层面的深刻变革。从技术的角度看&#xff0c;GPT-5代表着AI在自然语言处理领域的最新高度&#xff1b;而从更宽广的视…

Linux双网卡默认路由的metric设置不正确,导致SSH连接失败问题定位

测试环境 VMware虚拟机 RockyLinux 9 x86_64 双网卡&#xff1a;eth0(访问外网): 10.206.216.92/24; eth1(访问内网) 192.168.1.4/24 问题描述 虚拟机重启后&#xff0c;SSH连接失败&#xff0c;提示"Connection time out"&#xff0c;重启之前SSH连接还是正常的…

音视频入门基础:H.264专题(8)——H.264官方文档的描述符

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…

Java代码基础算法练习-删除有序数组中的重复项-2024.05.07

任务描述&#xff1a; 有一批同学需要计算各自的出生年月是否闰年。请使用算法计算出他们的出生年份是否闰年。 解决思路&#xff1a; 如果要一次性输出结果&#xff0c;就是先输入数字n&#xff0c;确定首先循环几次&#xff0c;在每次循环中进行闰年判断操作&#xff0c;每次…

RK3588/算能/Nvidia智能盒子:[AI智慧油站」,以安全为基,赋能精准经营

2021年9月&#xff0c;山东省应急管理厅印发了关于《全省危险化学品安全生产信息化建设与应用工作方案&#xff08;2021-2022 年&#xff09;》的通知&#xff0c;要求全省范围内加快推进危险化学品安全生产信息化、智能化建设与应用工作&#xff0c;建设完善全省危险化学品安全…

遥感数据并行运算(satellite remote sensing data parallell processing)

文章内容仅用于自己知识学习和分享&#xff0c;如有侵权&#xff0c;还请联系并删除 &#xff1a;&#xff09; 之前不太会用&#xff0c;单纯想记录一下&#xff0c;后面或许还会用到 1. 教程 [1] Pleasingly Parallel Programming: link 1.1 处理器&#xff0c;核和线程 …

山东水利职业学院空调集控系统案例,节能减排、降低维护成本

日常在公共办公场所使用空调时&#xff0c;人离开办公室空调依然开着&#xff0c;由于适用空调的不良行为导致能源浪费。良好的学习环境是保持学生好的学习状态的前提条件&#xff0c;让学生在炎热的夏季都能享受到舒适的室内空气环境是很重要的&#xff0c;对空调集中管理&…

ASUS/华硕天选Air 2021 FX516P系列 原厂win10系统

安装后恢复到您开箱的体验界面&#xff0c;带原机所有驱动和软件&#xff0c;包括myasus mcafee office 奥创等。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http:…

Spring Clude 是什么?

目录 认识微服务 单体架构 集群和分布式架构 集群和分布式 集群和分布式区别和联系 微服务架构 分布式架构&微服务架构 微服务的优势和带来的挑战 微服务解决方案- Spring Cloud 什么是 Spring Cloud Spring Cloud 版本 Spring Cloud 和 SpringBoot 的关系 Sp…

深度学习 —— 1.单一神经元

深度学习初级课程 1.单一神经元2.深度神经网络3.随机梯度下降法4.过拟合和欠拟合5.剪枝、批量标准化6.二分类 前言 本套课程仍为 kaggle 课程《Intro to Deep Learning》&#xff0c;仍按之前《机器学习》系列课程模式进行。前一系列《Keras入门教程》内容&#xff0c;与本系列…

STM32 IWDG(独立看门狗)

1 IWDG简介 STM32有两个看门狗&#xff1a;一个是独立看门狗&#xff08;IWDG&#xff09;&#xff0c;另外一个是窗口看门狗。独立看门狗也称宠物狗&#xff0c;窗口看门狗也称警犬。本文主要分析独立看门狗的功能和它的应用。 独立看门狗用通俗一点的话来解释就是一个12位的…

在Ubuntu上安装VNC服务器教程

Ubuntu上安装VNC服务器方法&#xff1a;按照root安装TeactVnc&#xff0c;随后运行vncserver输入密码&#xff0c;安装并打开RickVNC客户端&#xff0c;输入服务器的IP&#xff0c;最后连接输入密码即可。 VNC或虚拟网络计算&#xff0c;可让您连接到远程Linux / Unix服务器的…

udp Socket组播 服务器

什么是组播 组播也可以称之为多播这也是 UDP 的特性之一。组播是主机间一对多的通讯模式&#xff0c;是一种允许一个或多个组播源发送同一报文到多个接收者的技术。组播源将一份报文发送到特定的组播地址&#xff0c;组播地址不同于单播地址&#xff0c;它并不属于特定某个主机…

laravel的日志使用说明

文章目录 了解系统的默认支持多个通道时它们的关系如何使用驱动默认日志是同步的 了解系统的默认支持 Laravel 日志基于「 通道 」和 「 驱动 」的。那么这个通道是干嘛的&#xff1f;驱动又是干嘛的&#xff1f; 通道 &#xff1a; 1.它表示了某种日志格式化的方式&#xff…