C++ (2)

一.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_ 或者_ 表明是类的内部成员
类定义的变量 =====> 对象

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值