C++ 开发工程师 第二周笔记 boolan.com

第二周

string类的设计

  • 防卫式声明
  • 构造函数
    • 拷贝构造 参数是自己的类型
  • = 拷贝赋值
    • 如果不写,编译器会完全复制过去,对于带指针的类,不好!
    • 参数也是自己类型
  • 数据不应该放到数组,最好是用多少 放多少
  • 析构函数

带指针的类一定要有big three 拷贝构造函数 拷贝赋值函数 析构函数

构造函数和析构函数

c的字符串是一个指针指向字符串头,最后加一个结束符号\0

如果初始化一个空字符串,则长度为1,放进去结束符号。
如果初始化一个非空字符串,则长度为字符串长度strlen+1,不要忘记结束符号

清理,析构函数要将动态分配的内存释放掉。

拷贝构造函数

如果没有,浅拷贝会造成World\0区域没有指针引用,造成内存泄漏,Hello\0被引用两次,修改一个,另一个也同时修改。

上图蓝色的两行等同。

拷贝赋值函数

两个对象都已经存在
1. 清空被赋值的对象
2. 重新分配一个和值一样大的空间
3. 拷贝

检测自我赋值

大气,效率高,否则可能造成数据丢失 甚至崩溃。

output函数

cout可以接受字符串指针。

stack 栈 heap 堆

Stack 是存在与某作用域(scope)的一块内存空间(memory space)。比如,当你调用函数,函数本身会形成一个stack来放置它所接收的参数,以及返回地址。
在函数本体(function body)内声明的任何变量,其所使用的内存块都取自上述stack。

Heap 又称 system heap,是由操作系统提供的一块global内存空间,程序可动态分配(dynamic allocated)从中获得若干区块(blocks)。

生命周期

new

编译器进行如下操作
1. 分配内存 operator new 函数 内部调用malloc
2. 将得到的void指针转型
3. 通过指针调用构造函数 构造函数是成员函数,有this

delete

编译器转化为两个动作
1. 调用析构函数
2. operator delete 释放内存 内部调用free

动态分配得的内存块 VC


图中一个格4字节

灰色部分是调试模式下额外的分配的内存,红色部分是cookie,上下各一个
上下cookie记录分配的长度,比如,64,十六进制为40,最后一个bit代表该块内存是否已分配,故41。因为分配的内存为16的倍数,故可以使用最后一位表示。
VC下 分配的内存一定为16的倍数,pad为填补

其他编译器类似。

动态分配得的array VC

分配数组,vc用一个整数记录个数

array new 要搭配 array delete

delete 根据cookie删除内存,无论是delete还是delete[]都会完整的删除动态分配的内存,此处不会发生内存泄漏。delete[]会调用多次析构函数,用delete可能会导致字符串所指的地址的内存泄漏。
养成好习惯,array new 搭配 array delete

复习string类的实现

  • 防卫式声明
  • class 头
  • 怎么放数据
    • 数组 大小固定不好
    • 指针 动态分配内存 32位 指针4字节
    • 数据 private
  • 准备哪些函数
    • 构造函数
      • 无return type
      • 设计参数 接受一个c字符串
        • 参数不改变 加const
        • 有默认值 可以不给初值
      • 在声明外写函数体 String::String(…)
      • 参数有东西吗
        • 有 计算大小 注意字符串结尾 拷贝数据
        • 没有 空字符串也有结束符
      • inline
    • big three
      • 拷贝构造函数
        • 是构造函数 名字 没有返回类型
        • 参数是自己类型的
          • 传reference
          • 不改变 const
        • 分配空间
        • 拷贝数据
        • inline
      • 拷贝赋值函数
        • 函数名 operator=
        • 参数是自己类型
          • 传引用
          • 不改变参数 参数类型const
        • 返回值
          • 结果是自己类型的
          • by reference?
            • 返回值是不是local object
            • 不是 传reference
        • 旧数据删掉
        • 分配空间
        • 拷贝数据
        • 返回值 便于连续赋值
        • 是否自我赋值
          • 判断来源和目的是不是相同
      • 析构函数
        • 释放所有资源 文件 窗口 内存 等
        • array new 对应 array delete
        • inline
    • 其他辅助函数
      • 取字符函数 get_c_str()
      • 函数是否改变数据 const

static

之前,成员变量有好几份,成员函数只有一份,实际上,成员函数有this指针,来作用于不同对象。

带有static的变量和对象脱离了,只有一份。带有static的函数也是只有一份。

静态函数没有this pointer,因此不能像普通参数一样访问对象的非静态变量,只能存取静态数据。

语法上,需要在类的外面写黄色一行,可以赋值,也可以不赋值,严格讲,这一行叫定义,该行会使变量获得内存。类中的static double m_rate只是声明,这个变量实际上是脱离类的。

调用静态函数有两种方式:
1. 通过对象object调用
2. 通过类名class name 调用

构造函数放在private

单例模式a 只有一个,外部通过getInstance得到自己,该函数返回a,再通过这个a调用其他模式。

不完美,如果根本没有调用这个类,那么这个a一直存在,浪费。

改进

a放到函数里,如果不调用这个函数,a就不存在。

类模版 class template

不指定数据类型,用T代替,template<typename T>

函数模版 function template

这里用template <class T> 和上面的typename T相通。

函数模版不用指出数据类型,编译器会自动进行推倒 argument deduction

重载<运算符,完成大小比较。

标准库中算法使用函数模版。

namespace

为了避免冲突,使用

namespace std
{
...
}

把自己的东西包在std命名空间中,可以分段写。

使用有两种方法
1. 使用命令 directive
using namespace std; 将这个命名空间全部打开
2. 使用声明 declaration
using std::cout;

其他

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
【4层】3100平米综合办公楼毕业设计(含计算书、建筑结构图) 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 、2项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。、资 5源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。、 5资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值