IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 一些容易混淆的概念 -> 正文阅读

[C++知识库]一些容易混淆的概念

1.delete 和 delete[]

前提了解

  • 系统默认实现了 new/delete、new[]/delete[]、placement new/delete(借助已经存在的内存来构建对象)6个运算符函数
  • new 完成两个工作:1.分配一块动态内存空间;2.调用构造函数初始化对象
  • delete 完成两个工作:1.调用对象类型的析构函数;2. 释放这块内存空间
  • C++ 中分配数组内存时系统内部会增加4/8子节的分配空间来保存所分配的数组对象的数量;当对数组对象调用构造和析构函数时就可以根据这个数量值对每个数组元素进行遍历处理了;此外,只会对类类型增加额外内存保存数量而基础类型不会(基础的没有析构函数)
  • 支持new/delete 运算符的重载:
  • new 关键字创建堆内对象有两部,任何一步都会异常:
    • 如果在第一步出现了问题导致内存分配失败则不会调用构造函数,这是没有问题的
    • 如果在第二部构造函数执行过程中出现了异常就会停止构造函数的执行并且自动调用对应的delete运算符来对已经分配的堆内存进行执行销毁处理,此为对象的自动删除计数
  • 全局delete 运算符函数所支持的对象自动删除计数虽然能解决对象本身的内存泄漏文图,但不能 解决对相关构造函数内部的数据成员的内存分配泄漏问题, 所以可以重载delete运算符
  • 使用new 申请的单个对象的内存空间的释放,需要使用delete
  • 使用new[] 申请的一组对象的内存空间的释放,可以分为两种:
    • 基本数据类型:如int* a = new int[10]; 此时使用delete或delete[]都能释放,基本类型对象没有析构函数,且在内存分配时会记录分配的空间大小,所以delete能正确释放内存
    • 类类型:如 Student* p = new Student[10]; 如果是delete p,则只会调用p[0]这个元素的析构函数,剩余的元素内存没有被释放;上面说了对类类型的数组会有额外的空间来存放数据数量,调用delete[] 会对数组元素逐一调用析构函数
  • 总言之,配对使用

接下来两个,辨别的方式是从右往左读,就近原则

2.常量指针和指针常量

  • 常量指针: 首先是指针,指向一个常量;const *
    • 不能通过该指针改变所指对象的值,但没有规定那个对象的值不能通过其他途径改变:指向常量的指针,只是这个指针自己觉得既然指向了常量,自己觉得不应该改变那个值
    • 一般指针类型和所指类型要保持一致,这里允许一个指向常量的指针指向一个非常量对象
  • 指针常量: 首先是常量,类型是指针类型;* const
    • int* const cp;//从右向左,离cp 最近的是const,所以 cp 本身是常量,对象类型右声明符的其余部分确定,下一个符号是*,所以p是常量指针,最后一个是int ,连起来就是常量类型的整型指针
    • 既然是常量,那么指针指向的地址不可以变,但地址的内容可以变
  • 顶层const:表示指针本身是一个常量;底层 const:表示指针所指的对象是一个常量

3.数组指针和指针数组

  • 数组指针: 首先是指针,指向一个数组——指向数组首地址的指针

    • float a[4][5]; float (*p)[5] = a;
      从右向左看,但括号优先级高,所以先确定p是一个指针,再看[],这个指针指向的对象是一个数组,最后是float,连起来,p是一个指向包含4个float类型一维数组的指针
      void test_08() {
      	int num = 0;
      	int a[4][5];
      	int(*p)[5] = a;//
      	for (int i = 0; i < 4; i++) {
      		for (int j = 0; j < 5; j++) {
      			*(*(p + i) + j) = num++;
      		}
      	}
      	//range for 只能遍历
      	for (auto &i : a) {
      		for (auto j : i) {
      			cout << j << "\t";
      		}
      		cout << endl;
      	}
      }
      
  • 指针数组: 首先是数组,数组的元素是指针

    • float * p [5];
      从右向左看,首先是[],确定p是一个数组,再看到*,确定数组的元素是指针,最后float,连起来,p是一个包含5个float指针的数组
  • **优先级:()> [] > * **


4.初始化和赋值

  • 初始化不是赋值
  • 初始化的含义是创建变量时赋予一个初始值
    • 拷贝初始化: 使用 = ,将等号右侧的初始值拷贝到新创建的对象中【类存在拷贝构造函数】
    • 直接初始化: 不适用 = ,小括号,花括号
  • 赋值的含义是**把已有的对象的值擦除,**以一个新的值代替【类中赋值运算符重载】
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:08:08  更:2022-04-01 23:08:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:57:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码