C++入门到理解阶段二核心篇(1)——c++面向对象概述、内存分析、引用
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++面向对象概述、内存分析、引用的更多相关文章
- C++入门到理解阶段二基础篇(8)——C++指针
1.什么是指针? 为了更加清楚的了解什么是指针?我们首先看下变量和内存的关系,当我们定义了int a=10之后.相当于在内存之中找了块4个字节大小的空间,并且存储10,要想操作这块空间,就通过a这个变 ...
- C++入门到理解阶段二基础篇(6)——C++数组
概述 C++ 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量. 数组的声明并不是声明一个个单独的变量,比如 numbe ...
- C++入门到理解阶段二基础篇(5)——C++流程结构
1.顺序结构 程序从上到下执行 2.选择结构(判断结构) 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的). C++ 编程 ...
- C++入门到理解阶段二基础篇(3)——C++数据类型
目录 1.数据类型概述 2.基本的内置类型 整型 实型(浮点型) 字符型 转义字符 字符串型 c风格的字符串 c++风格的字符串 布尔类型bool 1.数据类型概述 使用编程语言进行编程时,需要用到各 ...
- C++入门到理解阶段二基础篇(1)——简介与环境安装
1.C++ 简介 C++ 是一种静态类型的.编译式的.通用的.大小写敏感的.不规则的编程语言,支持过程化编程.面向对象编程和泛型编程. C++ 被认为是一种中级语言,它综合了高级语言和低级语言的特点. ...
- C++入门到理解阶段二基础篇(9)——C++结构体
1.概述 前面我们已经了解到c++内置了常用的数据类型,比如int.long.double等,但是如果我们要定义一个学生这样的数据类型,c++是没有的,此时就要用到结构体,换言之通过结构体可以帮我们定 ...
- C++入门到理解阶段二基础篇(7)——C++函数
目录 函数作用 函数定义 函数声明 函数调用 函数值传递 函数常见的样式 函数的分文件书写 函数作用 将经常使用的代码封装起来,减少重复代码 函数定义 C++ 中的函数定义的一般形式如下: retur ...
- C++入门到理解阶段二基础篇(4)——C++运算符
目录 算术运算符(进行四则运算) 赋值运算符(表达式的值赋给变量) 比较运算符(表达是比较,返回一个真值或假值) 逻辑运算符(返回表格式的结果真或假) 位运算符 杂项运算符 C++ 中的运算符优先级 ...
- C++入门到理解阶段二基础篇(2)——C++注释、变量、常量、关键字、标识符
目录 1.注释 注释作用 注释的方式 2.变量 变量基本知识 定义变量 3.常量 常量基本知识 整数常量 浮点常量 布尔常量 字符常量 字符串常量 常量定义 使用 #define 预处理器. 使用 c ...
随机推荐
- 2019年JVM面试都问了什么?快看看这22道面试题!(附答案解析)
一. Java 类加载过程? Java 类加载需要经历一下 7 个过程: 1. 加载 加载是类加载的第一个过程,在这个阶段,将完成一下三件事情: • 通过一个类的全限定名获取该类的二进制流. • 将该 ...
- python爬虫--代理.让你的ip在坚挺一会!!
代理 代理简述 代理服务器:实现请求转发,从而可以实现更换请求的ip地址 在requests中如何将请求的ip进行更换 代理的匿名度: 透明:服务器知道你使用了代理并且知道你的真实ip 匿名:服务器知 ...
- spring cloud详解
1.Spring boot与Spring cloud 之间的关系 Spring boot 是 Spring 的一套快速配置脚手架,可以基于spring boot 快速开发单个微服务 Spring ...
- Wonder第一期3D引擎和编辑器线下培训班报名开始啦(免费学习)
Wonder第一次举办 针对3D底层技术的 线下培训班,免费学习,请大家多多支持-感谢- 培训地点 成都 开课时间 报名满5人开课. 报名方式 加QQ群:732861508 备注请写:报名培训 老师介 ...
- NLP标注工具brat 配置文件说明
快速搭建brat 通过docker: docker run --name=brat -d -p 38080:80 -e BRAT_USERNAME=brat -e BRAT_PASSWORD=brat ...
- 分布式事物 - 基于RPC调用 - 补偿模式
前提 所有服务均有独立的事物管理机制,相互间没有任何关联. 所有业务接口都有对应的补偿方法,用于将已经更新的数据还原到上一次的状态. 本次实例为同步业务,理想状态下,只有全部成功或全部失败两种情况. ...
- kafka2.3.1+zookeeper3.5.6+kafka-manager2.0.0.2集群部署(centos7.7)
一.准备三台服务器,配置好主机名和ip地址 二.服务器初始化:包括安装常用命令工具,修改系统时区,校对系统时间,关闭selinux,关闭firewalld,修改主机名,修改系统文件描述符,优化内核参数 ...
- Spring Boot 设置项目名后静态文件相对路径问题
出现问题的原因 server.servlet.context-path=testDemospring.mvc.static-path-pattern=/static/**定义项目名和静态资源路径后发现 ...
- ubuntu虚拟环境的操作
查看已经安装的虚拟环境:workon 退出虚拟环境,home目录下执行:deactivate 进入虚拟环境:workon 虚拟环境名
- IT兄弟连 HTML5教程 CSS3属性特效 文字描边
用CSS3实现的文字描边效果,一个CSS3文字特效实例,字体可以自己随意改,字体颜色也可以自己改.IE9以下浏览器无效果,所以提醒大家测试时候要使用Google Chrome.-webkit-text ...