核心篇
- 内存四区
- 在程序运行前就有代码区和全局区了,代码运行后就有堆区和栈区了
- 在程序运行前就有代码区和全局区了,代码运行后就有堆区和栈区了
-
- 程序运行前(const修饰的一些变量即其他常量)
- 程序运行前(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只读
- 普通的可读可写
- 函数重载碰到默认参数
- 写函数重载尽量不要加默认参数,避免二义性
- 引用作为重载条件
- 3.1函数默认值
- 4.类和对象
- 具有相同性质的对象,我们抽象出来为类
- 类中的属性和行为统称为成员
- 成员变量和成员属性均指属性
- 成员函数和成员方法均指行为
- 4.1封装
- 意义
- 将属性和行为作为一个整体,来表现一个事物
- 可以通过行为给属性赋值
- class 类名{权限 属性 行为};
- 将属性和行为放在不同的权限下,加以控制
- 访问权限有三种
- 公共权限
- 类内外均可访问
- 保护权限
- 类内可以使用,类外不行 儿子可以拿到的
- 私有权限
- 类内可以使用,类外不行 儿子不可以拿到的
- 公共权限
- 4.1.2class默认权限为私有
- struct默认权限为公有
- 4.1.3成员属性设置为私有
- 可以自己控制读写的权限
- 将属性设为私有,将查询函数的权限设为公有
- 可以写
- 属性设为私有,只设置写的函数,不设置读的函数
- 可以自己控制读写的权限
- 案例知识点
- 可以将另外一个类作为自己的成员
- 可以将类写如其他头文件中,在头文件中加入
- # pragma once防止头文件重复包含
- # include<iostream>输入输出流
- using namespace std;标准命名空间
- 头文件中的类只要有声明和成员就行了
- 头文件中,在一个类中用到另外一个类需将其头文件包含进来
- 在源文件中加上头文件,只需加上函数的实现即可
- 你需要告诉编译器是哪个作用域下的函数,头文件::(表示在头文件作用域下的成员函数)
- 将属性和行为作为一个整体,来表现一个事物
- 意义
- 4.2对象的初始化和清理
- 4.2.1构造函数和析构函数
- 构造函数语法:类名(){}
- 构造函数没有返回值也不写void
- 函数名称和类名相同
- 构造函数可以有参数,因此可以发生重载
- 程序在调用对象时,会自动调用构造函数,只调用一次
- 构造函数的分类和调用
- 代码
- 代码
- 构造函数语法:类名(){}
- 4.2.1构造函数和析构函数
- 常量引用
-
-
-
-
-
- 两种分类
- 按参数分为有参和无参
- 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语句中过长的代码记得用{}将代码封装起来
- stream-流
以上内容均为个人所做笔记,仅为个人方便打开csdn时复习时使用