c++学习笔记系列1(内存四区,引用,函数提高)
2020-04-24 10:35
190 查看
1 内存分区模型
C++程序在执行时,将内存大方向划分为4个区域
- 代码区:存放函数体的二进制代码,由操作系统进行管理的-
- 全局区:存放全局变量和静态变量以及常量-
- 栈区:由编译器自动分配释放, 存放函数的参数值,局部变量等
- 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
1.1 程序运行前
在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域
代码区:
存放 CPU 执行的机器指令
代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可
代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令
全局区:
全局变量和静态变量存放在此.
全局区还包含了常量区, 字符串常量和其他常量也存放在此.
该区域的数据在程序结束后由操作系统释放.
总结:
C++中在程序运行前分为全局区和代码区
代码区特点是共享和只读
全局区中存放全局变量、静态变量、常量
常量区中存放 const修饰的全局常量 和 字符串常量
1.2 程序运行后
形成栈区,堆区
1.3 new操作符
#include<bits/stdc++.h> using namespace std; int main(){ int *a=new int[10]; for(int i=1;i<=10;i++){ a[i]=i; cout<<a[i]<<" "; } }
2 引用
1注意事项:
- 引用必须初始化
- 引用在初始化后,不可以改变
int main() { int a = 10; int b = 20; //int &c; //错误,引用必须初始化 int &c = a; //一旦初始化后,就不可以更改 c = b; //这是赋值操作,不是更改引用 cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "c = " << c << endl; system("pause"); return 0; }
2.2 引用做函数返回值
-
作用:引用是可以作为函数的返回值存在的
-
注意:不要返回局部变量引用
-
用法:函数调用作为左值(静态 局部变量)
#include<bits/stdc++.h> using namespace std; int &test1(){ int a=10; return a; } int &test2(){ static int a=20; return a; } int main(){ int& ref = test1(); cout << "ref = " << ref << endl; cout << "ref = " << ref << endl; //如果函数做左值,那么必须返回引用 int& ref2 = test2(); cout << "ref2 = " << ref2 << endl; cout << "ref2 = " << ref2 << endl; test2() = 1000; cout << "ref2 = " << ref2 << endl; cout << "ref2 = " << ref2 << endl; system("pause"); return 0; }
2.3 引用的本质
本质:引用的本质在c++内部实现是一个指针常量
//发现是引用,转换为 int* const ref = &a; void func(int& ref){ ref = 100; // ref是引用,转换为*ref = 100 } int main(){ int a = 10; //自动转换为 int* const ref = &a; 指针常量是指针指向不可改,也说明为什么引用不可更改 int& ref = a; ref = 20; //内部发现ref是引用,自动帮我们转换为: *ref = 20; cout << "a:" << a << endl; cout << "ref:" << ref << endl; func(a); return 0; }
2.4 常量引用
-
作用:常量引用主要用来修饰形参,防止误操作
-
在函数形参列表中,可以加const修饰形参,防止形参改变实参
//引用使用的场景,通常用来修饰形参 void showValue(const int& v) { //v += 10; cout << v << endl; } int main() { //int& ref = 10; 引用本身需要一个合法的内存空间,因此这行错误 //加入const就可以了,编译器优化代码,int temp = 10; const int& ref = temp; const int& ref = 10; //ref = 100; //加入const后不可以修改变量 cout << ref << endl; //函数中利用常量引用防止误操作修改实参 int a = 10; showValue(a); system("pause"); return 0; }
3 函数提高
3.1 函数默认参数
int func(int a, int b = 10, int c = 10) { return a + b + c; } //1. 如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值 //2. 如果函数声明有默认值,函数实现的时候就不能有默认参数 int func2(int a = 10, int b = 10); int func2(int a, int b) { return a + b; } int main() { cout << "ret = " << func(20, 20) << endl; cout << "ret = " << func(100) << endl; system("pause"); return 0; }
3.2 函数占位参数
//函数占位参数 ,占位参数也可以有默认参数 void func(int a, int) { cout << "this is func" << endl; } int main() { func(10,10); //占位参数必须填补 system("pause"); return 0; }
3.3 函数重载
3.3.1 函数重载概述
**作用:**函数名可以相同,提高复用性
函数重载满足条件:
- 同一个作用域下
- 函数名称相同
- 函数参数类型不同 或者 个数不同 或者 顺序不同-
- 注意: 函数的返回值不可以作为函数重载的条件
3.3.2 函数重载注意事项
- 引用作为重载条件
- 函数重载碰到函数默认参数
#include<bits/stdc++.h> using namespace std; //函数重载注意事项 //1、引用作为重载条件 void func(int &a) { cout << "func (int &a) 调用 " << endl; } void func(const int &a) { cout << "func (const int &a) 调用 " << endl; } //2、函数重载碰到函数默认参数 void func2(int a, int b = 10) { cout << "func2(int a, int b = 10) 调用" << endl; } void func2(int a) { cout << "func2(int a) 调用" << endl; } int main() { int a = 10; func(a); //调用无const func(10);//调用有const func2(10); //碰到默认参数产生歧义,需要避免 system("pause"); return 0; }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 【C++】学习笔记草稿版系列3(引用基础与提高)
- c++学习笔记 内存四区 函数调用模型 指针强化
- C++学习笔记(五)(内存分区,引用,函数)
- c++学习笔记 内存四区 函数调用模型 指针强化
- C++学习笔记1(结构体,命名空间,标准输入输出,引用,函数,构造函数)
- C++学习笔记(13)——利用对象、引用、指针调用虚函数
- 【从C到C++学习笔记】引用/const引用/引用传递/引用作为函数返回值/引用和指针的区别
- 【C++】学习小笔记系列-4-何时使用引用参数
- C/C++中关于地址、指针和引用变量的学习笔记(九) : 内存结构
- C++学习笔记2--函数重载 复杂的数据 内存对齐 指针数组 结构与指针 传值传址传引用 联合枚举类型别名
- C语言提高之技术模型层次、学习标准、特点、内存四区、函数调用模型
- [c++学习笔记]反汇编角度看变量名和引用作为函数参数
- c++学习笔记(四):函数按指针调用和按引用调用
- LInux C++学习day02 C++的布尔类型bool 操作符别名 C++的函数 C++的动态内存管理 C++的引用(reference)
- VS2010 C++ 学习笔记(一) 引用 函数参数默认值 函数重载 内联inline
- C++常引用作为函数的参数学习笔记
- c++学习笔记(返回引用的函数)
- C/C++学习之C提高----C程序数组排序、数据类型(大小,别名,封装)、变量、程序的内存四区模型(栈,堆,全局,代码区)
- C++学习笔记(一)——内存、引用、const
- [C++学习笔记]--常量对象、常量成员函数和常引用