C++一个StringBad类

设计一个字符串类,下面的代码是一个不好的设计,起名StringBad。

//stringbad.h
#pragma once
//一个设计有问题的string类
#include <iostream>
using namespace std;class StringBad
{
public:StringBad();//默认构造函数StringBad(const char* s);//构造函数~StringBad();//析构函数friend ostream& operator<<(ostream& os, const StringBad& s);//友元函数,输出函数
private:char* str;//指向保存的字符串int len;//字符串的长度static int num_strings;//创建的对象数量
};

//stringbad.cpp
#define _CRT_SECURE_NO_WARNINGS
#include "stringbad.h"
#include <cstring>int StringBad::num_strings = 0;//类中的变量StringBad::StringBad()//默认构造函数
{len = strlen("趣字节");str = new char[len + 1];//动态创建内存,用于存放默认字符串strcpy(str,"趣字节");num_strings++;//对象数量+1cout << "默认构造函数," << str << ",对象数量:" << num_strings << endl;//不重要的输出
}StringBad::StringBad(const char* s)//构造函数
{len = strlen(s);str = new char[len + 1]; //动态创建内存,用于存放传入的字符串sstrcpy(str,s);num_strings++;//对象数量+1cout << "构造函数," << str << ",对象数量:" << num_strings << endl;//不重要的输出
}StringBad::~StringBad()
{cout << "析构函数," << str; //不重要的输出delete[]str;  //释放动态内存str = NULL;len = 0;num_strings--;//对象数量-1cout << ",对象数量:" << num_strings << endl;//不重要的输出
}ostream& operator<<(ostream& os, const StringBad& s)//友元函数,输出函数
{os << s.str << endl;return os;
}

测试程序如下:


#include"stringbad.h"int main()
{StringBad s1("趣字节,有趣的编程!!!");cout << "s1:" << s1;cout << "-------------" << endl;StringBad s2 = s1;cout << "s2:" << s1;cout << "-------------" << endl;StringBad s3;s3 = s1;cout << "s3:" << s3;return 0;
}

程序运行崩溃,并提示错误

1.png

        上面的代码在构造s2时已经出错(s3也有问题),构造s2时并没有调用构造函数,后面在析构s2时程序直接崩溃。这就是常说的浅拷贝导致的问题。
        C++提供下面这些默认函数(如果您没有提供):
        ●默认构造函数。不接受参数也不执行任何操作。
        ●默认析构函数,不执行任何操作。
        ●拷贝(复制)构造函数。用对象初始化另一个新建对象,逐个复制非静态成员,复制的是成员的值(浅复制)。
        ●拷贝赋值运算符。用对象赋值给另一个对象,逐个复制非静态成员,复制的是成员的值(浅复制)。
        ●移动构造函数。C++11增加。
        ●移动赋值运算符。C++11增加。
        ●地址运算符。返回对象的地址。和我们想象一致,不再讨论。
        使用默认拷贝构造函数和使用默认=赋值运算符,导致浅拷贝,在析构时会出现重复释放(delete)同一段内存,导致程序崩溃。
        解决的办法:自己定义拷贝构造函数和赋值=运算符重载函数,实现深拷贝。

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

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

相关文章

计算机毕业设计 | springboot+vue会议室管理系统(附源码)

1&#xff0c;绪论 1.1 项目背景 随着企业规模的不断扩大&#xff0c;会议室管理愈加复杂。传统的手工预约会议室的方式已经无法满足现代企业的需求&#xff0c;因此&#xff0c;开发一套会议室系统方案变得尤为重要。会议室系统可以实现会议室的在线预约、会议室资源的有效利…

每日学习一点:Chatgpt使用shell脚本

前言 本章&#xff0c;需要使用一个会写shell脚本的AI&#xff0c;比如chatgpt 4o&#xff0c;和了解shell脚本并会使用 当然这需要使用linux&#xff0c;其他系统当然也可以做到&#xff0c;就自学吧(๑•̀ㅂ•́)و✧ 使用脚本来完成&#xff0c;一些重复任务的自动化 1.了…

MyBatis二、搭建 MyBatis

MyBatis二、搭建 MyBatis 开发环境MySQL 不同版本的注意事项驱动程序&#xff08;Driver&#xff09;JDBC URL连接参数MyBatis配置文件版本兼容性常见问题与解决方案示例&#xff08;MySQL 8.x与MyBatis连接&#xff09; 创建 Maven 工程打包方式&#xff1a;Jar引入依赖创建数…

rman 备份集没有control file的恢复

rman备份文件&#xff0c;而且是备份的数据文件&#xff0c;没有控制文件没有参数文件的备份&#xff0c;所以普通的 &#xff08;1&#xff09; 先恢复控制文件restore controlfile from ‘…bak’; &#xff08;2&#xff09; 然后catalog start with ‘/data/20…

【TB作品】MSP430 G2553 单片机口袋板,电风扇模拟控制系统设计

功能 电风扇模拟控制系统设计 基本要求: 用LED/LCD 显示电风扇的工作状态 (1,2,3,4 四档风力), 显示风类:“自然风”、“常风”和“睡眠风”。 设计 “自然风”“常风”和“睡眠风” 三个风类键用于设置风类 设计一个“摇头”键用于控制电机摇头。 设计一个“定时”键&#x…

慢SQL的治理思路

慢SQL的治理思路 什么是慢SQL慢SQL产生的原因查看慢 SQL 是否开启开启慢 SQL 记录开启慢查询日志分析慢 SQL解决和优化慢SQL的方法 什么是慢SQL 慢 SQL 指的是 MySQL 中执行比较慢的 SQL&#xff0c;排查慢 SQL 最常用的方法是通过慢查询日志来查找慢 SQL。 MySQL 的慢查询日志…

使用element的过渡效果来做动效

transition来做过渡效果&#xff1a; <transition name"el-zoom-in-bottom"><div></div> </transition> name属性&#xff1a; 属性描述el-fade-in-linear淡入淡出匀速&#xff1b;el-fade-in淡入淡出快速&#xff1b;el-zoom-in-center中…

快速排序与归并排序(非递归)

目录 快速排序&#xff08;双指针法&#xff09; 原理 代码 快速排序&#xff08;非递归&#xff09; 原理 代码 归并排序 介绍 优点 缺点 图片 原理 代码 归并排序&#xff08;非递归&#xff09; 代码 快速排序&#xff08;双指针法&#xff09; 快速排序的精…

2024年06月编程语言流行度排名

点击查看最新编程语言流行度排名&#xff08;每月更新&#xff09; 2024年06月编程语言流行度排名 编程语言流行度排名是通过分析在谷歌上搜索语言教程的频率而创建的 一门语言教程被搜索的次数越多&#xff0c;大家就会认为该语言越受欢迎。这是一个领先指标。原始数据来自…

python中的抽象基类详解

在Python中&#xff0c;抽象基类&#xff08;Abstract Base Classes&#xff0c;简称ABCs&#xff09;是一种特殊的类&#xff0c;主要用于定义接口&#xff0c;即一组方法的规范&#xff0c;但不提供这些方法的实现。抽象基类不能被直接实例化&#xff0c;除非其所有抽象方法都…

【30天精通Prometheus:一站式监控实战指南】第15天:ipmi_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

(奇幻森林)POLYGON - Enchanted Forest - Nature Biomes - 3D Environment Art by Synty

各种雄伟的树木,装饰着优雅简化的树叶,在头顶形成了一个天堂般的树冠,在苔藓覆盖的森林地面上投下了宁静的咒语。 每一项资产,从引人入胜的环境材料到平缓的波浪状山丘,都经过精心制作,将您带到魔法和自然融合的地方。POLYGON-魔法森林-自然生物技术为数字领域注入真正魔…

60 关于 SegmentFault 的一些场景 (2)

前言 呵呵 此问题主要是来自于 帖子 月经结贴 -- 《Segmentation Fault in Linux》 这里主要也是 结合了作者的相关 case, 来做的一些 调试分享 当然 很多的情况还是 蛮有意思 本文主要问题如下 1. 访问异常堆栈地址1 2. 访问异常堆栈地址2 3. 访问异常堆栈地址3 4. sta…

第三届大湾区算力大会丨暴雨开启数字未来新篇

5月30-31日&#xff0c;韶关市迎来主题为“算启新篇智创未来”的第三届粤港澳大湾区(广东)算力产业大会暨第二届中国算力网大会&#xff0c;活动由广东省人民政府主办&#xff0c;广东省政数局、韶关市人民政府共同承办。暴雨信息作为算力产业发展的重要构建者受邀赴会&#xf…

Java的数据库编程-----JDBC

目录 一.JDBC概念&使用条件&#xff1a; 二.mysql-connector驱动包的下载与导入&#xff1a; 三.JDBC编程&#xff1a; 使用JDBC编程的主要五个步骤&#xff1a; 完整流程1&#xff08;更新update&#xff09;&#xff1a; 完整流程2(查询query)&#xff1a; 一.JDB…

汪小菲直播翻车亲儿子直言麻六记有异味网友热议引爆话题

汪小菲直播翻车&#xff01;亲儿子直言“麻六记”有“异味”&#xff0c;网友热议引爆话题在星光璀璨的娱乐圈&#xff0c;汪小菲一直以家庭幸福、事业有成的形象示人。然而&#xff0c;近日的一场直播让他遭遇了前所未有的尴尬。在直播中&#xff0c;汪小菲兴致勃勃地向观众跨…

链表头部插入结点

Linked List Inserting a node at beginning #include<stdlib.h>//为了用malloc #include<stdio.h> struct node {int data;struct node* next;//在cpp中可以只写 Node *Link&#xff1b;//为了表意明确&#xff0c;Link也经常被命名为next }; struct node* head…

视频搬运的素材网站有哪些?打包好的视频素材在哪找?

短视频创作的朋友们&#xff0c;欢迎进入这个充满创意的世界&#xff01;如果你曾为找不到合适的素材而苦恼&#xff0c;那么今天就让我为你介绍几个能够快速丰富你视频内容的素材平台。无论是为了搬运视频还是寻找灵感&#xff0c;下面这些网站都将是你的强力助手。特别地&…

【软件测试】6.设计测试用例的设计方法

目录 1.基于需求的设计方法 2.具体的设计方法 2.1等价类 2.2边界值 2.3正交法 2.4判定表法 2.5场景法 2.6 错误猜测法 1.基于需求的设计方法 基于需求的设计方法也是总的设计测试用例的方法&#xff0c;在工作中&#xff0c;我们需要参考需求文档/产品规格说明书来设计…

MySQL—函数(介绍)—字符串函数(基础)

一、引言 提到函数&#xff0c;在SQL分类中DQL语句中有一个聚合函数&#xff0c;如COUNT()、SUM()、MAX()等等。这些都是一些常见的聚合函数&#xff0c;而聚合函数只是函数的一种&#xff0c;接下来会详细的学习和介绍一下函数的应用场景和以及 mysql 当中文件的函数有哪些。 …