黑马c++学习笔记核心篇

这篇博客详细介绍了C++程序运行时内存的四个区域:代码区、全局区、栈区和堆区。重点讲解了栈区和堆区的区别,以及局部变量和动态内存分配。还涉及了new关键字的使用,包括如何创建和释放内存,以及指针和引用的概念。此外,讨论了常量引用、函数参数的默认值、函数重载以及构造函数和析构函数的作用。最后,提到了类和对象的封装概念,以及对象初始化和清理的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

核心篇

  • 内存四区
    • 在程序运行前就有代码区和全局区了,代码运行后就有堆区和栈区了

    • 程序运行前(const修饰的一些变量即其他常量) 

    • 全局区详解

    • 总结

    • 程序运行后

      • 栈区
        • 首先局部变量存放在了栈上,数据在函数执行完后自动释放
          • 返回局部变量后,打印两次,数据不一致,因为函数执行完后,就将数据释放,后面的不是你想要的数据
          • 第一次可以打印正确的数据是因为编译器给你做了一次保留,第二次数据便不再保留了
          • 我们通常把不是我们想要的数据称为乱码
          • 代码

      • 堆区

        • 代码

         

        • 解释堆区和栈之间的关系(指针指向栈,栈存放堆区数据的地址)

  • new关键字
    • 语法
      • 创建值
        • int* p=new int(10)
        • 释放内存delete p;
      • 创建数组
        • int* p=new int[10]
        • 释放数组
        • delete []p;告诉编译器我要释放一段很长的空间
  • 引用
    • 起别名
    • 不会再拷贝一份数据
    • 语法
      • 数据类型 &别名=原名;
    • 注意事项
      • 引用必须初始化
      • 初始化后就不可以改变了
        • int& b=a;
        • b=c;此时是做初始化操作
    • 引用做函数参数
      • 代码

      • 代码

      • 通过引用参数与指针产生的效果一样,但引用更加简单了
    • 引用做函数的返回值
      • 引用代码

      • 可以做为左值使用
        • 函数的返回是一个引用,
        • 返回局部变量引用,第一次打印正确第二次就错了
      • 不要返回局部变量的引用
    • 引用的本质(c++推荐这种方式,因为简化了指针操作)
      • 本质
        • 引用的在c++内部是一个指针常量
        • 指向不可改,值可以改
      • 编译器转换为指针常量

    • 常量引用
      • 防止误操作
      • void printf(const int &val);
        • 在函数内部不可修改
    • 3函数的提高
      • 3.1函数默认值
        • void hh(int a,int b=20,int c=10)
        • 可这样调用hh(10),即a=10,其他默认
        • 改变了就是用更新的值
        • 注意事项
          • 从第一个默认参数开始,之后的均要有默认参数
          • 函数声明有默认值,那么函数实现就不能有默认参数(防止二义性,只能有一个有默认值)
      • 3.2函数占位参数(可以有默认参数)
        • 语法
          • 返回类型 函数名(数据类型){}
        • 目前阶段的站位参数无用
          • void hh(int a,int b=20,int =10)
          • void hh(int a,int,int )
      • 3.3函数重载
        • 看语境,编译器自己选择调用哪个
        • 3.3.1函数重载
          • 让函数重名,提高函数的复用性
          • 条件
            • 同一作用域下
            • 函数名相同
            • 函数参数类型、个数、顺序不同
            • 函数返回值不能作为函数重载的条件
              • 想想编译器这么调用
        • 3.3.2函数重载的注意事项
          • 引用作为重载条件
            • 有无const
            • 引用的内容要么是栈区要么是堆区
            • const只读
            • 普通的可读可写
          • 函数重载碰到默认参数
            • 写函数重载尽量不要加默认参数,避免二义性
    • 4.类和对象
      • 具有相同性质的对象,我们抽象出来为类
      • 类中的属性和行为统称为成员
      • 成员变量和成员属性均指属性
      • 成员函数和成员方法均指行为
      • 4.1封装
        • 意义
          • 将属性和行为作为一个整体,来表现一个事物
            • 可以通过行为给属性赋值
          • class 类名{权限  属性  行为};
            • 将属性和行为放在不同的权限下,加以控制
            • 访问权限有三种
              • 公共权限
                • 类内外均可访问
              • 保护权限
                • 类内可以使用,类外不行 儿子可以拿到的
              • 私有权限
                • 类内可以使用,类外不行 儿子不可以拿到的
          • 4.1.2class默认权限为私有
            • struct默认权限为公有
          • 4.1.3成员属性设置为私有
            • 可以自己控制读写的权限
              • 将属性设为私有,将查询函数的权限设为公有
            • 可以写
              • 属性设为私有,只设置写的函数,不设置读的函数
          • 案例知识点
            • 可以将另外一个类作为自己的成员
            • 可以将类写如其他头文件中,在头文件中加入
              •  # pragma once防止头文件重复包含
              •  # include<iostream>输入输出流
              • using namespace std;标准命名空间
              • 头文件中的类只要有声明和成员就行了
              • 头文件中,在一个类中用到另外一个类需将其头文件包含进来
            • 在源文件中加上头文件,只需加上函数的实现即可
              • 你需要告诉编译器是哪个作用域下的函数,头文件::(表示在头文件作用域下的成员函数)
      • 4.2对象的初始化和清理
        • 4.2.1构造函数和析构函数
          • 构造函数语法:类名(){}
            • 构造函数没有返回值也不写void
            • 函数名称和类名相同
            • 构造函数可以有参数,因此可以发生重载
            • 程序在调用对象时,会自动调用构造函数,只调用一次
          • 构造函数的分类和调用
            • 代码

            • 两种分类
              • 按参数分为有参和无参
                • person(){},person(){}。
              • 按类型分为普通构造和拷贝构造
                • person(){},person( const person &p){ age=p.age}
            • 三种调用方式
              • 代码

              • 括号法
                • person p1;//无参
                • person p1(10);//有参
                • person p2(p1);//拷贝
              • 显示法
                • person p1;
                • person p1=person(10);等号右侧的为匿名对象
                • person p2=person(p2);等号右侧的为匿名对象
                • 匿名对象,当前行结束后,系统会立即回收匿名对象
                  • 注意事项2:不要利用拷贝构造函数 初始化匿名对象
                  • person (p3);
                  • 编译器会认为它是一个对象的声明即person(p3)==person p3;
              • 隐式转换法
                • person p4=10;有参
                • person p5=p4;拷贝
                • 编译器会将其转换为显示
            • 4.2.3拷贝构造函数调用时机
              • 三种情况
                • 使用一个已经创建完毕的对象来初始化一个新对象
                • 值传递的方式给函数参数传值
                  • 拷贝一个临时的副本也会调用构造函数
                • 以值方式返回局部对象
          • 析构函数语法:~类名(){}
            • 析构函数没有返回值也不写void
            • 函数名称与类名相同,在前面加上~
            • 析构函数不可以有参数,因此不会发生重载
            • 程序销毁对象时,会自动调用析构函数,只调用一次
  • 职工管理系统
    • stream-流
      • fstream-为文件流,是文件操作的宏常量
    • ofstream ofs;定义一个文件操作对象
      • ofs.open(FILENAME,ios::out),以输出的方式打开文件
      • 记得关闭文件,.close
    • 文件处理的三种情况(均放在构造函数中使用)
      • 判断文件是否存在(文件不存在)
        • 用ifstream ifs;
        • ifs.open(FILENAME,ios::in),以读的方式打开文件
      • 文件存在且数据为空
        • 当文件存在时,有一个文件尾标志,用一个字符将标志位拿走
        • 用函数ifs.eof()判断文件是否为空,为1时表示文件为空。
        • 其余和文件不存在一致
      • 文件存在不为空
        • 初始化数组
        • 在构造函数中追加初始化职工的代码
    • 记录当前职工人数,用读文件的方式
      • while(ifs>>id&&ifs>>name&&ifs>>did) num++
      • 会自己跳过空格然后将数据读入对应的位置
    • case语句中过长的代码记得用{}将代码封装起来

以上内容均为个人所做笔记,仅为个人方便打开csdn时复习时使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪子不顾及三毛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值