文章目录
个人学习资料存档,(参考课本为中国铁道出版,陈维兴,林小茶编著,C++面向对象程序设计第三版),重点知识点选择非常主观,根据自己知识的漏洞和模糊点整理,仅仅为了复试面试准备的,侧重定义,名词解释,以及易混淆知识点的对比记忆
C++存储类
定义:存储类定义C++程序中变量/函数的可见范围和生命周期
auto存储类
○ 声明变量时根据初始化表达式自动推断该变量的类型
○ 声明函数时函数返回值的占位符
static存储类
○ 使用static修饰局部变量可以在函数调用之间保持局部变量的值
○ 不需要在每次他进入和离开作用域时进行创建和销毁
extern存储类
○ 提供一个全局变量的引用,可以认为extern用来在另一个文件中声名一个全局变量(对所有程序文件都可见)
const修饰符
const修饰符+指针=指向常量的指针
常指针:是指指向常量的常指针,不能动,地址是常量
指针和引用
指针是一个变量,其值为另一个变量的地址
引用是一个别名,一旦把引用初始化为某个变量,就可以用该引用名称来指向变量
区别方法
○ 初始化→引用必须在创建时初始化;指针可以在任何时间初始化
○ 是否可变?引用只有在初始化的时候可变;指针可变
○ 能否为空?引用不能为空,引用必须链接到一块合法的内存;指针可以为空
this指针
○ c++中每一个对象都能通过this指针来访问自己的地址
○ 使用:在成员函数内部可以用来指向调用对象
○ 总是指向当前对象,是所有成员函数的隐含参数(PS:友元函数没有,因为友元函数不是成员函数)
类和对象
对象
○ 定义:将描述其属性的数据和对这些数据施加的一组操作封装到一起的统一体(数据+操作)
类
○ 定义:相同数据和相同操作的一组对象的集合(数据+函数)
○ 类中的数据和方法称为类的成员
○ 类的成员函数
■ 定义:把定义和原型写在类内部的函数
■ PS:友元函数不属于成员函数(友元类:整个类及所有成员都是友元)
○ 类的特殊成员函数
■ 类构造函数
● 使用:创建类的新对象时执行
● 用途:可用于为某些成员变量设置初始值
■ 类析构函数
● 使用:删除所创建对象时执行
● 用途:有助于在跳出程序前释放资源
○ 内联函数
■ 目的:解决程序中函数调用的效率问题(用空间换时间)
■ 原理:编译器编译时将程序中出现的内联函数调用表达式用内联函数的函数体进行替换(1到5行的小函数)
■ 隐式内联函数
● 定义在类内
■ 显式内联函数
● 在类内显式声明,类外定义(成员被函数前加了inline)
○ 类访问修饰符
■ 类成员的访问限制是通过在类主题内部对各个区域标记public,private,protected来指定的,即访问修饰符
■ public:类外部可访问
■ private:外部不可访问,类和友元函数可访问
■ protected:派生类中可访问
static静态成员
无论创建多少个类的对象,静态成员都只有一个副本
不会在对象销毁时销毁,生命周期较长
静态成员函数
○ 只能访问静态成员数据,其他静态成员函数,类外其他函数
○ 如果把函数成员声明为静态的,静态成员函数即使在类对象不存在的情况下也能被调用
○ 静态VS普通
■ 静态成员函数无this指针,只能访问静态成员
■ 普通成员函数有this指针,可以访问类中任意成员
继承
引入目的:使得创建和维护一个应用程序更加容易,达到了重用代码功能 和提高执行效率的效果
派生类可以访问基类所有非私
公有继承
○ 基类:public protected private
○ 派生类:public protected private
保护继承
○ 基类:public protected private
○ 派生类:protected protected private
私有继承
○ 派生类:private private private
重载
同一作用域中某个函数和运算符指定多个定义
重载声明:前有在该作用域内声明过的函数/方法具有相同名称的声明,但参数列表和定义(实现)不相同
重载决策:当调用一个重载函数/运算符时,编译器通过把使用的参数类型和定义中的参数类型进行比较,选择最合适的
函数重载
○ 同一作用域内,声明几个功能类似的同名函数,但形式参数(参数个数,类型顺序)必须不同,不能仅仅通过返回类型不同来重载函数
运算符重载
○ 可重定义或者重载大部分c++内置运算符(这样能使用自定义类型运算符)
多态
运行时:继承和虚函数
编译时:函数和运算符重载
虚函数(virtual)
基类中某成员函数被声明为虚函数后,此虚函数可以在一个或者多个派生类中被重新定义
作用:为了方便使用多态特性;基本情况下基类本身生成对象是不合情理的
纯虚函数
虚函数VS重载函数
○ 派生类中重新定义基类的虚函数是函数重载的另一种形式,虚函数在派生类中被重新定义时,其函数原型,返回类型,函数名称,参数个数都必须与基类中的原型完全相同
○ 普通重载函数,其函数的参数或者参数类型必须有所不同,返回类型可以不同
C++程序内存空间
stack栈
○ 函数内部声明的所有变量都将占用栈内存(运行期间函数调用时参数的传递也在栈上)
heap堆
○ 程序未使用的内存,程序运行时可用于动态分配内存
new VS malloc
○ new无需指定内存块的大小;malloc需显式指出内存尺寸
○ new和delete是关键字,需要编译器;malloc和free是库函数,需要头文件
○ new分配后返回对象类型指针;malloc返回void
○ new失败显式bad-malloc异常;malloc失败返回void
○ c++允许重载new/delete;malloc 不允许
普通函数VS内联函数VS宏定义
○ 普通函数被调用时先去函数入口地址去执行函数体,执行完成后在回到函数调用地方继续
○ 内联函数是函数,但不用寻址;常有类型检查
○ 宏定义不是函数,预处理器用复制宏代码的方式代替函数的调用,省去了函数压栈退栈过程,无类型检查
数组指针VS指针数组
○ 数组指针是专门指向数组的指针变量
○ 指针数组指的是多个指针变量
结构体VS类
○ 结构体是一种包含了具体不同数据类别的包装;默认public;值类型(存储数据的值);用栈存储;无继承,多态
○ 类是反映现实事物的一种抽象;默认private;引用类型(存储对实际数据的引用);用堆存储;有继承,多态
内存溢出VS内存泄漏
○ 内存溢出就是不够用,申请时没有足够的内存空间供其使用
○ 内存泄漏是退不掉,申请后无法释放内存空间
值传递 VS 指针传递 VS 引用传递(地址传递)
○ 值传递中实参和形参位于不同地址,形参改变不会影响实参(实参先复制一次拷贝,把拷贝的内容复制给形参)
○ 指针传递本质是值传递,传递地址值,形参存放实参值(对形参操作不影响实参)
○ 地址传递中形参存放实参地址(对形参操作影响实参的值)
重载 VS 重写 VS 重定义
○ 重载,同一作用域内,函数可以相同,但参数不能完全相同(函数重载不同函数)
○ 重写,子类定义了一个与父类及其相像的虚函数,函数名和参数列表都相同
○ 重定义,子类定义了一个与父类同名的函数(只关注函数名,与参数和返回类型都无关)
局部变量 VS 全局变量
○ 局部变量存放在堆栈中;局部变量可以和全局变量重名
○ 全局变量存放在静态数据库;引用一个已经定义过的全局变量可以选择引用头文件或external关键字
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。