c函数引用全局变量出错undefined reference_C++ & QT ---05(内存、指针、引用、函数高级)...

C++核心编程

面向对象编程技术,探讨C++中的核心和精髓

1 内存分区模型

C++程序执行时,将内存大方向划分为4个区域:

1、代码区:存放函数体的二进制代码,由操作系统进行管理。

2、全局区:存放全局变量、静态变量(static)、常量(#define/const)

3、栈区:由编译器自动分配释放,存放函数的参数值(形参)局部变量等。

4、堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。

内存四区意义:不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程

1.1 程序运行前

在程序编译后,生成了 exe 可执行程序,未执行该程序前分为两个区域

代码区:

1、存放CPU执行的机器指令。

2、代码区时共享的,共享的目的时对于频繁被执行的程序,只需要在内存中有一份代码即可

3、代码区是只读的,使其只读的原因是防止程序意外地修改了他的指令。

全局区:

1、全局变量(函数外)静态变量(static int a)存放在此

2、全局区还包含了常量区(int a)字符串常量其他常量(const int a)也在这

3、该区域的数据在程序结束后由操作系统释放。

b63e898afc2a595575da0581864239da.png

总结:

1、C++中在程序运行前分为全局区和代码区

2、代码区特点是共享和只读

3、全局区中存放全局变量、静态变量、常量

4、常量区中存放 const 修饰的全局常量 和 字符串常量

1.2 程序运行后

栈区:由编译器自动分配释放,存放函数的参数值、局部变量等。

注意:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放

7dd3b6819ea109d35b5965a7a0084200.png

堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。

注意:在C++中主要利用 new ,在堆区开辟内存。

75e7e3a1655794d7664b23d3846ede20.png

1.3 new操作符

C++中利用 new 操作符在堆区开辟数据

堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符 delete

语法: new 数据类型

利用 new 创建的数据,会返回该数据对应的类型的指针

36b560c29f0a168777bed95cdbf64122.png
释放内存后不能访问 0x8123
#include

ef6fbf35c00fe9f9b394dd60de9df1a0.png

2 引用

2.1 引用的基本使用

作用:给变量起别名

语法:数据类型 &别名 = 原名

814d126e647acee26fa4cc773a5ab360.png
结果都是10

2.2 引用注意事项

1、引用必须初始化:直接int &b;//报错

2、引用在初始化后,不可以改变

c470194aecbb42c85d4cfe79bd3c5ac1.png
不能更改别名

2.3 引用做函数参数

作用:函数传参时,可以利用引用的技术让形参修饰实参

优点:可以简化指针修改实参

#include

87a09d4f3a792c2df5784682f15d5da9.png

2.4 引用做函数返回值

作用:引用时可以作为函数的返回值存在的

注意:不要返回局部变量引用(栈区数值被清空)

用法:函数调用做左值

#include

9ae6d5281822f55a922ae1882fc23413.png

2.5 引用的本质

本质:引用的本质在C++内部是一个指针常量(* const)

int & ref = a;相当于 int * const ref = &a;

f5655f2d0779940c92aaac8388f0ed56.png

结论:C++推荐引用技术,因为语法方便,引用本质是指针常量,但所有的指针操作,编译器都帮我们做了

2.6 常量引用

作用:常量引用主要用来修饰形参,防止误操作

在函数形参列表中,可以加 const 修饰形参,防止形参改变实参

#include

3函数提高

3.1 函数默认参数

在C++中,函数的形参列表中的形参可以有默认值

语法:返回值类型 函数名(参数 = 默认值){ 代码体 }

#include

d0b2c2ad76fdad8adbda26acf2dad401.png

注意事项:

1、如果某个位置已经有了默认参数,那么从这个位置往后,从左到右都必须有默认值

2、如果函数声明有了默认参数,函数的实现不能有默认参数,只能二选一,不能同时。

3.2 函数占位参数

C++ 中函数的形参列标可以有占位参数,用来做占位,调用函数时必须填补该位置

语法:返回值类型 函数名 (数据类型){ }

注意:占位参数还可以有默认参数

c0ed61ef8f14b475a7e5c49693052beb.png
传入的数据类型需相同

3.3函数重载

3.3.1 函数重载概述

作用:函数名可以相同,提高复用性

函数重载满足条件:

(1)同一个作用域下;(main或者全局作用域)

(2)函数名称相同;

(3)函数参数 类型不同 或者 个数不同 或者 顺序不同

注意:函数的返回值不可以作为函数重载的条件

1a52f33c37c239b6e1cbc74b62d90d12.png
因为可接收,也可不接收

3.3.2 函数重载注意事项

1、引用作为重载条件

2、函数重载碰到函数默认参数

#include

1-3章结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值