一.const
C++中的const修饰的是一个常量:
1、const常量正常情况下内存不会为其分配空间,而是存在符号表中
2、使用的时候去符号表中取值你
3、如果对 const 常量进行取地址操作,则编译器会为其分配一块空间,但是 它本身并不会使用
4、建议用 const 替换 宏常量
const 和 define 的区别:
1、define 是预处理的处理,做的工作是累心完全替换,在程序中会有多个备份
const 是编译的时候处理,会进行变量的类型和作用域检测,只在符号表中有一个备份
const 和 define 相同点:定义常量
二.引用
1、引用的概念
引用 :空间的别名
类型 &别名 = 其他变量
// a 是变量名, 代表一个4字节的空间
int a = 10;
// b 是 a 所代表的的空间的别名
// b 和 a 代表的是同一块空间
int &b = a;
定义引用的时候必须要赋予初值
2、引用的作用:
在一定程度上可以替换指针
3、使用引用进行函数传参
4、引用本质: 是常量指针 int &ra ===> int * const ra
三.各类引用
1、函数返回值为引用 : 不能返回局部变量的引用,可以返回静态变量或者全局变量的引用
(1)不接收返回值
func();
(2)使用普通变量接收函数返回值,接收到的变量的 值
int a = func();
cout << "a = " << a << endl;
a = 50;
func();
(3)使用引用接收返回值,接收到的是 空间(引用)
int &a2 = func();
a2 = 100;
func();
(4)函数如果返回的是一个引用,则可以作为左值使用
func() = 200;
func();
2、指针引用
3、常引用
常引用:1、引用普通变量 2、引用常量
四.内联函数
1、定义常量 宏常量 ==> 建议 const 进行替换
2、定义函数 宏函数 ==> 建议 内联函数 进行替换
内联函数:在函数定义前 加 inline 关键字,那么该函数就是内联函数, 函数声明前加是无效的
内联函数在函数调用的用函数定义去替换,避免了函数的入栈、出栈、跳转等开销
内联函数是在编译的时候处理的,宏函数是在预处理的时候处理的
注意:
1、内联是一种请求,有可能内联不成功
2、程序运行的时候,内联函数是没有代码空间的,在编译的时候已经替换完了
所以不能对内联函数进行取地址操作 ====> 不能作为回调函数 ====> 不可调试
1、内联函数的函数体不要太大,不要超过5行
2、不要有任何形式的循环语句
3、不要有复杂的判断语句
内联的实现:内联函数被存在符号表中,实际调用的时候在符号表中取值
五.动态内存分配
1、C 中 使用 malloc 和 free ===> 库函数 不是语法的一部分
2、C++中 使用 new 和 delete ===> 运算符(+、-、*…) 是语法的一部分
例如:strlen 是函数,计算字符串长度 sizeof 运算符 计算变量类型所占空间大小(栈上的空间)
1、申请单个变量空间
new : 类型* 变量名 = new 类型(初始值)
释放 :delete 指针
new 在申请空间的时候可以对空间进行初始化
2、申请数组
new : 类型 * 变量名 = new 类型[个数]
申请数组的时候不能进行初始化
释放:delete 释放数组的时候 一定要加 [] 不然会导致内存泄漏
3、申请多维数组空间
C语言中
// int a[3][4];
申请连续内存
int (*pa)[4] = (int (*)[4])malloc(sizeof(int)/sizeof(char)*12);
for (int i; i < 3; i++)
{
for (int j; j < 4; j++)
{
pa[i][j] = i*4+j;
}
}
free(pa);
C++中
int (*p2)[4] = new int[3][4];
delete[] p2;
int** p3 = new int*[3];
for (int i = 0; i < 3; i++)
{
p3[i] = new int[4];
}
申请不连续内存
for (int i = 0; i < 3; i++)
{
delete[] p3[i];
}
delete [ ] p3;
六.C++ 11中 新增加的特性
1、自动类型推导 ====> auto
2、空指针类型 nullptr 为了和 NULL 进行区分
3、统一初始化: 所有变量都可以用 {} 进行初始化
4、初始化列表 initializer_list<元素类型>
列表中提供两个函数 begin 一个 end 分别指向列表第一个元素和最后一个元素的下一个元素
可以认为他们是个指针
5、for 新的遍历形式
int arr[10] {1,2,3,4,5,6,7,8,9,10};
for (int i = 0; i < 10; i++)
{
cout << arr[i] << endl;
}
for (int a : arr)
{
cout << a << " ";
}
cout << endl;
七.面向 对象 编程
例如: 实现通讯录:
面向过程:有哪些功能:增加用户、删除用户、修改、查找…
面向对象:通讯录实现有哪个东西(对象) --> 用户、用户管理(操作用户:加用户、删除用户、修改、查找…)
===> 一个场景 场景的东西(对象) 通过某种机制(激励),让各个对象动起来
面向对象三个特性:(抽象)、封装、继承、多态
封装:
1、将对象的属性(变量)和方法(函数)整合到一起
2、可以对某部分内容进行隐藏(不让外部使用)
class类 类似结构体
类的访问控制:
public 公有属性 : 自己和外部的都能用
private 私有属性 : 自己能用, 外部不能用
protected 保护属性 : 自己能用, 外部不能用
类中的成员 默认属性是 私有的 结构体默认是公有的
类的属性放到 类的最下面, 设置私有的, 加m_ 或者_ 表明是类的内部成员
类定义的变量 =====> 对象