1.c++内存分区模型

c++程序在运行的过程中,内存会被划分为以下四个分区

代码区:程序的所有程序的二进制代码,包括注释会被放到此区

全局区:存放静态变量、全局变量、常量(字符串常量和const修饰的常量),此区的数据将在程序结束后由操作系统释放

using namespace std;
//不在任何函数内的变量是全局变量
int a = 10;
int b = 23;

int main() {
	//在某个函数内的变量
	int c = 12;
	cout << (int)&a << endl;
	cout << (int)&b << endl;
	cout << (int)&c << endl;

}

栈区:用于存放局部变量、函数参数等,是由编译器自动释放和分配,所以不能让栈区返回一个地址,

#include <iostream>
#include <string>
using namespace std;

int* f() {
	int a = 10;
	return &a;//栈区不要返回地址。局部变量是由编译器自动释放和分配
}
int main() {

	int* p = f();
	cout << *p;//10 第一次编译器会做保留
	cout << *p;//不会打印10
}

堆区:存储对象(使用new操作符,后面会介绍)由程序员分配释放,若我们不释放,程序结束由操作系统释放

c++中通过new关键字将数据开辟到堆区

#include <iostream>
using namespace std;
int* f() {
	/*
	*1.指针本身也是局部变量,存放在栈长中,但是保存的数据在堆中
	2.new关键字开辟一块堆区,返回的是该数据类型的指针
	*/
	int *a = new int(10);
	return a;
}
int main() {
	int* p = f();
	cout << *p;//10
	cout << *p;//10
	//3.堆区的数据程,序员可以通过该delete释放
	delete p;
	//cout << *p;异常
}

如果是new一个数组

//new一个数组
int* arr = new int[10];
//释放一个数组
delete[] arr;

注意

代码区和全局区是程序编译成exe可执行文件的时候就已经有了,但是栈区和堆区是程序exe文件执行后产生的

2.为什么划分内存(内存划分意义)

将不同的数据放在不同的区域,赋予不同的生命周期,提高编程灵活程度

3.引用

使用引用给一个变量起别名

#include <iostream>
using namespace std;

int main() {
	int a = 10;
	/*1.定义引用的格式  数据类型 &别名=原名
	*2.引用必需要初始化
	*3.引用初始化后,不可更改
	*/
	int& b = a;
	cout << b;//10
}

前面文章中的地址传递会修改实参,值传递不会修改实参,引用作为函数参数会修改实参,简化使用指针修改实参的复杂过程

#include <iostream>
using namespace std;
void swap(int &a,int &b) {
	int temp = a;
	a = b;
	b = temp;
}
int main() {
	int a = 10;
	int b = 20;
	swap(a,b);
	cout << a;//20
	cout << b;//10
}

局部变量不能作为函数的返回值返回

#include <iostream>
using namespace std;
int& f() {
	int a = 10;//栈区中的局部变量在函数执行完后释放
	return a;
}
int main() {
	int &a = f();
	cout << a;//10 编译器保留
	cout << a;//不在是10
}

如果是局部静态变量,可以返回

#include <iostream>
using namespace std;
int& f() {
	static int a = 10;//栈区中的局部变量在函数执行完后释放
	return a;
}
int main() {
	int &a = f();
	cout << a;//10
	cout << a;//10
}
#include <iostream>
using namespace std;
int& f() {
	static int a = 10;//栈区中的局部变量在函数执行完后释放
	return a;
}
int main() {
	int &a = f();
	cout << a;//10
	cout << a;//10
	f() = 100;//如果函数的返回是一个引用,可以作为左值
	cout << a;//100
	cout << a;//100
}

引用本质是指针常量

int main() {
	int a = 1;
	//内部发现是引用,自动转成指针常量 int * const b=&a;
	int& b = a;
	b = 2;//内部发现是引用,自动转成*b=20;
	cout << a;//2
	cout << b;//2
}

常量引用

#include <iostream>
using namespace std;
//使用const修改函数形参,防止误操作
void f(const int& a) {
	//a = 100;不允许修改
}
int main() {
	int& b = 1;//引用本身需要一个合法内存空间,所以这行代码有误
	int a = 10;
	f(a);
}

4.函数相关

前面c++基础系列有关函数知识有所描述,这里补充一些函数高级知识

1.c++中函数可以有默认值

#include <iostream>
using namespace std;
//1.c++中函数可以有默认值,并且某个位置有了默认值,那么从这个位置开始左到右都的有默认值
int f(int a, int b = 10,int c=20) {
	return a + b + c;
}
int main() {
	int a = 10;
	//2.如果函数有默认值,当我们传值使用传递的值,不传值使用默认的
	cout<<f(a);//40
	cout << f(a, 20);//50
}
//3.声明和实现只能有一个有默认参数
int f1(int a, int b = 10);
int f1(int a, int b) {
	return a + b;
}

2.c++函数中可以有占位参数用来占位,调用函数必需填补该位置

#include <iostream>
using namespace std;

//1.只写一个数据类型就是占位
void f(int a,int) {
	cout << "test";
}
//2.占位参数可以有默认值
void f1(int a, int=10) {
	cout << "test";
}
int main() {
	int a = 10;
	f(a, 10);//占位参必须填补
}

3.函数重载

定义:同一个作用域下,两个函数参数类型不同或者参数顺序不同或者个数不同。此时这两个函数名字可以相同。提高复用性

#include <iostream>
using namespace std;

void f(int a,int b) {
	cout << "test";
}

void f(int a) {
	cout << "test";
}
int main() {
	int a = 10;
	f(a, 10);
}

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

4.引用也可作为函数重载条件

#include <iostream>
using namespace std;

void f(int &a) {//int &a=10;不合法
	cout << "test";
}

void f(const int &a) {//const int &a=10;合法
	cout << "test111";
}
int main() {
	int a = 10;
	f(a);//test
	f(10);//test111
}

5.函数重载遇到默认参数需要注意

void f(int a,int b=10) {//int &a=10;不合法
	cout << "test";
}

void f(int a) {//const int &a=10;合法
	cout << "test111";
}
int main() {
	int a = 10;
	f(a);//报错,出现二义性
}

C++入门到理解阶段二核心篇(1)——c++面向对象概述、内存分析、引用的更多相关文章

  1. C++入门到理解阶段二基础篇(8)——C++指针

    1.什么是指针? 为了更加清楚的了解什么是指针?我们首先看下变量和内存的关系,当我们定义了int a=10之后.相当于在内存之中找了块4个字节大小的空间,并且存储10,要想操作这块空间,就通过a这个变 ...

  2. C++入门到理解阶段二基础篇(6)——C++数组

    概述 C++ 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量. 数组的声明并不是声明一个个单独的变量,比如 numbe ...

  3. C++入门到理解阶段二基础篇(5)——C++流程结构

    1.顺序结构 程序从上到下执行 2.选择结构(判断结构) 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的). ​ C++ 编程 ...

  4. C++入门到理解阶段二基础篇(3)——C++数据类型

    目录 1.数据类型概述 2.基本的内置类型 整型 实型(浮点型) 字符型 转义字符 字符串型 c风格的字符串 c++风格的字符串 布尔类型bool 1.数据类型概述 使用编程语言进行编程时,需要用到各 ...

  5. C++入门到理解阶段二基础篇(1)——简介与环境安装

    1.C++ 简介 C++ 是一种静态类型的.编译式的.通用的.大小写敏感的.不规则的编程语言,支持过程化编程.面向对象编程和泛型编程. C++ 被认为是一种中级语言,它综合了高级语言和低级语言的特点. ...

  6. C++入门到理解阶段二基础篇(9)——C++结构体

    1.概述 前面我们已经了解到c++内置了常用的数据类型,比如int.long.double等,但是如果我们要定义一个学生这样的数据类型,c++是没有的,此时就要用到结构体,换言之通过结构体可以帮我们定 ...

  7. C++入门到理解阶段二基础篇(7)——C++函数

    目录 函数作用 函数定义 函数声明 函数调用 函数值传递 函数常见的样式 函数的分文件书写 函数作用 将经常使用的代码封装起来,减少重复代码 函数定义 C++ 中的函数定义的一般形式如下: retur ...

  8. C++入门到理解阶段二基础篇(4)——C++运算符

    目录 算术运算符(进行四则运算) 赋值运算符(表达式的值赋给变量) 比较运算符(表达是比较,返回一个真值或假值) 逻辑运算符(返回表格式的结果真或假) 位运算符 杂项运算符 C++ 中的运算符优先级 ...

  9. C++入门到理解阶段二基础篇(2)——C++注释、变量、常量、关键字、标识符

    目录 1.注释 注释作用 注释的方式 2.变量 变量基本知识 定义变量 3.常量 常量基本知识 整数常量 浮点常量 布尔常量 字符常量 字符串常量 常量定义 使用 #define 预处理器. 使用 c ...

随机推荐

  1. 自建CA证书搭建https服务器

    由于CA收费,所以可以自建CA,通过将CA导入浏览器实现https的效果,曾经12306购票就需要自行导入网站证书. 关于https 2015年阿里巴巴将旗下淘宝.天猫(包括移动客户端)全站启用HTT ...

  2. BBS项目知识点汇总

    目录 bbs项目知识点汇总 一. JavaScript 1 替换头像 2 form表单拿数据 3 form组件error信息渲染 4 添加html代码 5 聚焦操作 二 . html在线编辑器 三 . ...

  3. Python基础-day01-8

    变量的基本使用 程序就是用来处理数据的,而变量就是用来存储数据的 目标 变量定义 变量的类型 变量的命名 01. 变量定义 在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量 ...

  4. 自制导纳信号发生器 [原创cnblogs.com/helesheng]

    最近正在研制一种通过测量人体导纳,估算体内血液变化率,进而评估心血管系统泵血功能的医疗仪器.为测量人体导纳,我们设计了一套巧妙的激励信号幅度反馈电路,该电路由于涉及商业机密就不在这里讨论了.这里主要分 ...

  5. VMware kali虚拟机环境配置

    编译内核 (1)执行命令uname -r以查看内核版本. (2)执行命令apt-cache search linux-headers查看是否安装内核头文件. (3)  如果uname -r出现的内容在 ...

  6. Geoserver设置style

    1 背景 我们在ArcMap中可以直接通过symbol功能对图层进行定制化配图.但是,如果我们将配好图的shp图层在GeoServer中发布时,会发现图层样式完全丢失了.其实原因很简单,用ArcMap ...

  7. selenium的安装、报错和解决

      selenium是的作用是模拟点击浏览器上的按钮,配合一个无头浏览器就可以快速解决一些前端需要加解密的功能. 第一步pip install selenium安装的第一步就是用pip把模块下载回来. ...

  8. Pycharm导入Django项目

    Pycharm导入Django项目 添加项目:file-->open,找到项目所在的位置打开项目 添加django后台项目路径 file-->settings-->Languages ...

  9. rest.css解决不同浏览器元素默认样式不同的问题

    html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, ...

  10. vue app项目 第一天 基本架构和路由配置

    一.前言 今天开始打算花6天时间 完成一个基于vue的买菜app 在这里记录一下项目的流程和第一次做这个项目遇到的坑 以及解决的办法 二.第一步 脚手架的安装 使用npm 安装好脚手架  安装脚手架教 ...