源代码--编译-->目标文件--链接-->执行文件
内存:
RAM(Random Access Memory)随机存取器,运行程序时,程序从磁盘文件加载到RAM中,所有变量在RAM中生成,即内存。
ASCII(America Standard Code for Information Interchange)美国标准信息转换代码。
typedef(给现有类型起别名)
typedef 现有类型 别名
变量溢出,注意变量类型的内存大小
常量
#define XXX xxx,文本替换,预处理器将XXX替换为xxx
const int XXX = xxx,规定了常量的类型
枚举
enum XXX{xxx1, xxx2, xxx3};
重载
一个类中多个重名函数
内嵌函数(inline)
编译器不创建真实函数,而是将内嵌函数的代码直接复制到调用函数中,不存在程序跳转。
但当循环调用内嵌函数时,需多次将代码复制到调用函数中,影响程序性能。
类方法内嵌:在声明类的头文件中定义方法的实现。
应用:函数很小,切不会循环调用和多处调用的情况。
函数调用
调用函数时,其返回的地址和参数被放入堆栈,运行期间,局部变量也被放入堆栈,函数返回时,值从堆栈中被弹出删除。
函数返回时,将值拷贝后返回;如果返回的为对象,则将对象进行复制构造后返回;如果返回的为指向对象的指针,则不再进行复制构造。
int example(int x);
调用时,x是实参的局部拷贝,所以函数执行完之后,x实参的值不会改变;
int example(int *x);
调用时,x指向实参的地址,即间接引用实参。这种定义方式暴露了函数的内部运作,使用者需显示传递变量的地址。
int x = 10;
example(&x);
int example(int &x);
调用时,x是实参的引用。这种定义方式使得用户不必关心函数的工作原理。
int x = 10;
example(x);
XXX example(XXX x);
这种定义方式当参数是空间比较大的对象时,会调用复制构造函数,增加内存空间占用,降低执行速度,执行完会调用析构函数,增加系统开销。
过程:调用时,拷贝实参到x,执行完成后,析构x
XXX &example(XXX &x);
不对实参进行拷贝,但是破坏了数据的安全性(在函数内部可以对对象进行修改),解决:
const XXX &example(const XXX & const x);
--参数const表示,参数是const的指针,不能改变指针的指向,指针指向的对象也不能改变。
XXX *example(XXX *x);
不对实参进行拷贝,但是破坏了数据的安全性(在函数内部可以对对象进行修改),解决:
const XXX *example(const XXX * const x);
注:不要返回对不在作用域的对象的引用,返回在堆中的对象引用(函数体内new,返回*x)
指针&引用:
引用:使得程序更清晰,易于使用,能很好的隐藏信息。引用不能被重新赋值,不能为空。
指针:可被重新赋值,可为空。
规则:尽量使用引用进行参数传递和返回,并采用const进行保护。
类成员函数设计
类成员数据私有,创建公有访问和设置私有成员变量的方法。
将数据的存储细节与数据的使用分开。
类的构造函数
使用构造函数初始化对象。
给出构造函数,则编译器不会提供默认构造函数。
const常量(建议使用)
类的const方法不会改变类的成员变量的值。
void XXX() const;
const int * pAge;
//指向整型常量的指针,不能改变指向的值,若pAge是对象,则只能调用该对象的const方法
int * const pAge;
//指向整型的常量指针,不能改变指向的地址。
const int * const pAge;
//指向整形常量的常量指针,不能改变指向的地址以及地址内的值。
类与结构体
C语言有结构体,但该结构体没有类方法(函数),C++扩展C语言的结构体(有类方法),即类。
指针
是保存内存地址的变量。
指针需初始化为NULL或0,防止出现野指针。
作用:处理自由存储区的数据;访问类的成员数据和函数;通过引用的方式向函数传递变量。
int iAge = 10;
int * pAge = &iAge;
cout<<*pAge; //读取pAge地址处的变量值
数据存储
全局名字空间
存储全局变量
自由存储区
堆,程序结束时才被清除。
寄存器
保存栈顶指针和指令指针等
代码空间
存储代码
栈
存储局部变量和函数形参,函数返回时自动清除数据。
内存泄露
原因:1.局部指针变量在函数返回时被丢弃(作用域为整个函数),而通过new分配的内存不会主动释放,不能被其他数据使用,造成内存泄露。2.未释放指针便对其重新赋值。
解决:
1. delete指针,释放指针指向的内存空间。多次delete会造成程序崩溃,所有释放完后,将指针置为空,因为delete空指针是安全的。2.每new一次指针对应delete一次指针。
int *pAge = new int;
*pAge = 10;
delete pAge;
pAge = NULL;//防止出现野指针
pAge = new int;
引用
引用不能被重新赋值,需初始化引用,引用不能为空(即引用的对象为空)
int &rAge = age;
//rAge作为age的别名,
cout<<&rAge;
//输出rAge的内存地址,同age的内存地址
若rAge = age2,则意味着age = age2,即age,rAge,age2值相同,age,rAge的地址相同。