笔记三单一类设计

2023-10-13 06:58
文章标签 设计 笔记 一类 三单

本文主要是介绍笔记三单一类设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

单一类设计

文章目录

  • 单一类设计
    • 两种类
    • new与array new(delete)

两种类

对于类中没有指针的类,注意如下

  • 数据部分放到private声明中
  • 传参与返回值:参数尽量传递引用(效率高,值传递还需拷贝入栈),考虑是否加const
  • 不改变数据的成员函数要加const(如对私有数据的访问接口)
  • 构造函数初始化数据用初始化列表

实践:实现complex

#ifndef COMPLEX_H
#define COMPLEX_H#include <iostream>class myComplex;myComplex& __doapl(myComplex*, const myComplex&);class myComplex
{
public:myComplex(double r = 0, double i = 0) : re(r), im(i) {} // 带参构造函数,具有默认值,用初始列表初始化myComplex& operator+=(const myComplex&); // 重载 += 运算符,接受const&,返回&double real() const { return re; } // 不改变数据,声明为const常函数 double imag() const { return im; }private:double re, im; // 数据设置为privatefriend myComplex& __doapl(myComplex*, const myComplex&); // 友元函数可以直接访问myComplex的数据
};inline myComplex& __doapl(myComplex* ths, const myComplex& r)
{ths->re += r.real();ths->im += r.imag();return *ths;
}inline myComplex& myComplex::operator+=(const myComplex& r)
{return __doapl(this, r); 
}// 全局函数,重载+,复数加复数,结果是局部的,的不能返回引用
// !这里还需重载(const myComplex& x, double y)等版本
inline myComplex operator+(const myComplex& x, const myComplex& y)
{return myComplex(x.real()+y.real(), x.imag()+y.imag()); // 返回局部对象
}// 重载<<
std::ostream& operator<<(std::ostream& os, const myComplex& r)
{return os << '(' << r.real() << ',' << r.imag() << ')';
}#endif

对于类存在指针的类

​ 实现深拷贝

  • 必须重写拷贝构造函数
  • 必须重写拷贝赋值函数(operator=()
  • 重写拷贝构造函数要检测自我赋值(this==&object),因为要先delete,所以一定要保证不是自我赋值

实践:重写string

#ifndef _MYSTRING_
#define _MYSTRING_#include <iostream.h>
#include <string.h>class String
{
public:String(const char* cstr = 0);String(const String& str); // 拷贝构造函数String& operator=(const String& str); // 拷贝赋值函数~String(); // 析构函数char* get_cstr() const { return m_data; }
private:char* m_data;
};inline String::String(const char* cstr = 0)
{if (cstr){m_data = new char[strlen(cstr) + 1];strcpy(m_data, cstr);}else{m_data = new char[1];m_data[0] = '\0';}
}inline String::~String()
{delete[] m_data;
}inline String::String(const String& str)
{m_data = new char[strlen(str.m_data + 1];strcpy(m_data, str.m_data);
}inline String& String::operator=(const String& str)
{if (this == &str) // 检测自我赋值{return *this;}delete[] m_data;m_data = new char[strlen(str.m_data + 1];strcpy(m_data, str.m_data);return *this;
}ostream& operator<<(ostream& os, const String& str)
{return os << str.get_cstr();
}#endif

new与array new(delete)

  • new [] 搭配了delete而不是delete []造成内存泄漏

    new String[3]

    delete [] p;

    delete先调用析构函数,再释放内存,根据上下的cookie delete能够释放p指向的3个String所在的内存空间

    但内存中有一个字节记录申请的对象个数,如果delete[] p将调用3次析构函数,释放String对象中指针所指空间,如果delete p将只调用一次析构函数,造成另外两个String中指针所指空间内存泄漏

    所以必须搭配使用

这篇关于笔记三单一类设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/201508

相关文章

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

SprinBoot+Vue网络商城海鲜市场的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w+