【C++初学】C++核心编程(一):内存管理和引用
前言
在C++的世界里,面向对象编程(OOP)是核心中的核心。它不仅是一种编程范式,更是一种思考问题的方式。本文将带你从C++的内存分区模型出发,深入探讨引用、函数、类和对象、继承、多态以及文件操作等核心概念。通过丰富的代码示例和详细的讲解,帮助你快速掌握C++面向对象编程的精髓。
1. C++内存分区模型
C++程序在运行时,内存被划分为四个主要区域:代码区、全局区、栈区和堆区。每个区域都有其独特的用途和生命周期。
1.1 程序运行前:代码区与全局区
代码区:存放函数体的二进制代码,由操作系统管理。代码区是共享且只读的,防止程序意外修改指令。
全局区:存放全局变量、静态变量和常量。全局区的数据在程序结束后由操作系统释放。
示例代码:
// 全局变量
int g_a = 10;
int g_b = 10;
// 全局常量
const int c_g_a = 10;
const int c_g_b = 10;int main() {// 局部变量int a = 10;int b = 10;// 打印地址cout << "局部变量a地址为: " << (int)&a << endl;cout << "局部变量b地址为: " << (int)&b << endl;cout << "全局变量g_a地址为: " << (int)&g_a << endl;cout << "全局变量g_b地址为: " << (int)&g_b << endl;// 静态变量static int s_a = 10;static int s_b = 10;cout << "静态变量s_a地址为: " << (int)&s_a << endl;cout << "静态变量s_b地址为: " << (int)&s_b << endl;cout << "字符串常量地址为: " << (int)&"hello world" << endl;cout << "字符串常量地址为: " << (int)&"hello world1" << endl;cout << "全局常量c_g_a地址为: " << (int)&c_g_a << endl;cout << "全局常量c_g_b地址为: " << (int)&c_g_b << endl;system("pause");return 0;
}

1.2 程序运行后:栈区与堆区
栈区:由编译器自动分配和释放,存放函数的参数值和局部变量。注意,不要返回局部变量的地址。
堆区:由程序员手动分配和释放,若不释放,程序结束时由操作系统回收。
示例代码:
int *func() {int a = 10;return &a; // 错误:返回局部变量的地址
}int main() {int *p = func();cout << *p << endl; // 未定义行为cout << *p << endl;system("pause");return 0;
}

堆区示例:
int* func() {int* a = new int(10);return a;
}int main() {int *p = func();cout << *p << endl;delete p; // 释放堆区数据system("pause");return 0;
}

int main()
{int* arr = new int[10];int i = 0;for (i = 0; i < 10; i++){arr[i] = i + 100;}for (i = 0; i < 10; i++){cout << arr[i] << endl;}delete[] arr;system("pause");return 0;
}

2. 引用
引用是C++中一个非常重要的概念,它可以为变量起一个别名,简化代码并提高效率。
2.1 引用的基本使用
引用的语法是:数据类型 &别名 = 原名。
示例代码:
int main() {int a = 10;int &b = a; // 引用b是a的别名cout << "a = " << a << endl;cout << "b = " << b << endl;b = 100; // 修改b,a也会改变cout << "a = " << a << endl;cout << "b = " << b << endl;system("pause");return 0;
}

2.2 引用注意事项
引用必须初始化。
引用初始化后不能改变。
示例代码:
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.3 引用做函数参数
引用可以作为函数参数,让形参直接修改实参的值,避免指针的复杂性。
示例代码:
void mySwap03(int& a, int& b) {int temp = a;a = b;b = temp;
}int main() {int a = 10;int b = 20;mySwap03(a, b);cout << "a:" << a << " b:" << b << endl;system("pause");return 0;
}

2.4 引用做函数返回值
引用可以作为函数的返回值,但要注意不要返回局部变量的引用。
示例代码:
int& test02() {static int a = 20; // 静态变量return a;
}int main() {int& ref2 = test02();cout << "ref2 = " << ref2 << endl;test02() = 1000; // 可以通过引用修改静态变量cout << "ref2 = " << ref2 << endl;system("pause");return 0;
}

2.5 引用的本质
引用在C++内部实现是一个指针常量。编译器会自动处理所有的指针操作。
示例代码:
void func(int& ref) {ref = 100; // 内部转换为 *ref = 100
}int main() {int a = 10;int& ref = a; // 自动转换为 int* const ref = &aref = 20; // 内部转换为 *ref = 20cout << "a:" << a << endl;cout << "ref:" << ref << endl;func(a);system("pause");return 0;
}

2.6 常量引用
常量引用可以防止误操作修改实参。
示例代码:
void showValue(const int& v) {cout << v << endl;
}int main() {const int& ref = 10; // 编译器优化:int temp = 10; const int& ref = temp;cout << ref << endl;system("pause");return 0;
}

相关文章:
【C++初学】C++核心编程(一):内存管理和引用
前言 在C的世界里,面向对象编程(OOP)是核心中的核心。它不仅是一种编程范式,更是一种思考问题的方式。本文将带你从C的内存分区模型出发,深入探讨引用、函数、类和对象、继承、多态以及文件操作等核心概念。通过丰富的…...
深度学习(对抗)
数据预处理:像素标记与归一化 在 GAN 里,图像的确会被分解成一个个像素点来处理。在你的代码里,transform transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))]) 这部分对图像进行了预处理: tra…...
(PC+WAP)大气滚屏网站模板 电气电力设备网站源码下载
源码介绍 (PCWAP)大气滚屏网站模板 电气电力设备网站源码下载。PbootCMS内核开发的网站模板,该模板适用于滚屏网站模板、电气电力设备网站源码等企业,当然其他行业也可以做,只需要把文字图片换成其他行业的即可;PCWAP,…...
笔试专题(九)
文章目录 十字爆破(暴力)题解代码 比那名居的桃子(滑动窗口/前缀和)题解代码 分组(暴力枚举 优化二分)题解代码 十字爆破(暴力) 题目链接 题解 1. 暴力 预处理 2. 如果单纯的暴…...
3 VS Code 配置优化与实用插件推荐:settings.json 详解、CodeGeeX 智能编程助手及插件离线安装方法
1 优化 settings.json 文件 1.1 settings.json 简介 settings.json 是 VS Code 的核心配置文件,用于存储用户的个性化设置和偏好。通过该文件,用户可以自定义和覆盖 VS Code 的默认行为,包括但不限于以下方面: 编辑器外观&#…...
TA学习之路——1.6 PC手机图形API介绍
1前言 电脑的工作原理:电脑是由各种不同的硬件组成,由驱动软件驱使硬件进行工作。所有的软件工程师都会直接或者间接的使用到驱动。 定义:是一个图形库,用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序接口(API)。…...
【android bluetooth 框架分析 02】【Module详解 2】【gd_shim_module 模块介绍】
1. 背景 上一章节 我们介绍了 module_t 的 大体框架 ,本节内容我们就选择 我们的 gd_shim_module 模块为例子,具体剖析一下,它里面的逻辑。 static const char GD_SHIM_MODULE[] "gd_shim_module";// system/main/shim/shim.cc …...
从一堆新闻正文中,提取出“事实型句子(fact)”,并保存到新文件中
示例代码: import os import re import json import nltk from tqdm import tqdm from transformers import pipeline nltk.download(punkt) from nltk.tokenize import sent_tokenize ## Check If Fact or Opinion #lighteternal/fact-or-opinion-xlmr-elfact_opi…...
Matlab 调制信号和fft变换
1、内容简介 Matlab 194-调制信号和fft变换 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
Git 常用命令集与实际使用 Demo
Git 常用命令集与实际使用 Demo 一、初始化 & 配置 命令说明Demogit init在当前目录初始化本地 Git 仓库,生成 .git/ 文件夹mkdir newProject && cd newProject git initgit config --global user.name “xxx”设置全局用户名git config --global use…...
KaiwuDB:面向AIoT场景的多模融合数据库,赋能企业数字化转型
引言 在万物互联的AIoT时代,企业面临着海量时序数据处理、多模数据融合和实时分析等挑战。KaiwuDB应运而生,作为一款面向AIoT场景的分布式、多模融合、支持原生AI的数据库产品,为企业提供了一站式数据管理解决方案。 产品概述 KaiwuDB是一…...
STM32 vs ESP32:如何选择最适合你的单片机?
引言 在嵌入式开发中,STM32 和 ESP32 是两种最热门的微控制器方案。但许多开发者面对项目选型时仍会感到困惑:到底是选择功能强大的 STM32,还是集成无线的 ESP32? 本文将通过 硬件资源、开发场景、成本分析 等多维度对比…...
100M/1000M 以太网静电浪涌防护方案
方案简介 以太网是一种生产较早且广泛应用的局域网通讯方式,同时也是一种协议,其核 心在于实现区域内(如办公室、学校等)的网络互联。根据数据传输速度的不同,以 太网大致可以划分为几个等级:标准以太网…...
使用ADB工具分析Android应用崩溃原因:以闪动校园为例
使用adb工具分析模拟器或手机里app出错原因以闪动校园为例 使用ADB工具分析Android应用崩溃原因:以闪动校园为例 前言 应用崩溃是移动开发中常见的问题,尤其在复杂的Android生态系统中,找出崩溃原因可能十分棘手。本文将以流行的校园应用&q…...
C语言中while的相关题目
一、题目引入 以下程序中,while循环的循环次数是多少次? 二、代码分析 首先要明确的一点 while循环是当循环条件为真 就会一直循环 不会停止 while中i是小于10的 说明i可以取到0 1 2 3 4 5 6 7 8 9 进入第一个if判断i小于1为真时执行continue i0是为真的 执行continue 后…...
关于使用 nuitka进行构建python应用的一些配置,以及github action自动构建;
1. 通用配置 # 设置输出目录和文件名output_dir "dist"app_name "CursorAutoFree"# 基础命令行选项base_options ["--follow-imports", # 跟踪导入"--enable-plugintk-inter", # 启用 Tkinter 支持"--include-packagecusto…...
[Dify] 基于明道云实现金融业务中的Confirmation生成功能
在金融业务的日常流程中,交易记录的处理不仅涉及数据录入、流程审批,更重要的是其最终输出形式——交易确认函(Confirmation)。本文将介绍如何通过明道云的打印模板功能,快速、准确地生成符合业务需求的交易Confirmation,提升工作效率与合规性。 为什么需要Confirmation?…...
「Unity3D」图片导入选项取消Read/Write,就无法正确显示导入大小,以及Addressable打包无法正确显示的问题
如果在Edit -> Project Settings -> Editor中的“Load texture data on demand”勾选,就会让图片导入设置中,不勾选Read/Write,就无法正确显示纹理的大小数字。 更进一步的问题是,使用Addressable打包的时候, 如…...
使用Java截取MP4文件图片的技术指南
在多媒体处理中,从视频文件中截取图片是一个常见的需求。本文将详细介绍如何使用Java结合FFmpeg实现从MP4文件中截取图片的功能。我们将通过几种不同的方法来实现这一目标,包括直接调用FFmpeg命令行工具、使用JavaCV库以及使用JAVE库。 环境准备 在开始…...
在C盘新建文本文档
设定 C: 的 NTFS 文件夹权限为 Users 或 Domain Users 具有写入权限; 1. 选中C盘 2. 点右键选中属性(properties) 3. 选“安全”(Security) Tab 4. Users 5. “编辑”(Edit) 6. Full Control …...
Xcode为不同环境配置不同的环境变量
一般有三种方式: 一、通过多Target 二、通过scheme,也就是多configurations 三、通过.xcconfig文件 先来看第二种方式:通过scheme,也就是多configurations,包括自定义User-settings 第一步:增加configurations,Xcode默认为我们生成了…...
阿里通义实验室发布图片数字人项目LAM,实现高保真重建
简介 LAM项目结合了3D Gaussian Splatting(高斯点云渲染)和大规模预训练模型的优势,解决了传统头部重建方法效率低、依赖多数据的痛点。其背景源于AI生成内容(AIGC)领域对实时、高保真3D头像生成的需求,尤其…...
面试算法高频05-bfs-dfs
dfs bfs 深度优先搜索(DFS)和广度优先搜索(BFS)是图和树遍历中的重要算法,二者在实现方式和应用场景上存在明显差异。 定义与概念:DFS在遍历树或图时,以深度优先,从起始节点出发,尽可能深入地探索分支,直至无法继续,再回溯;BFS则按层次逐层遍历,从起始节点开始,…...
镜像端口及观察端口的配置
配好路由器的各个接口的IP PC1ping PC3的IP,在路由器中抓2/0/0端口的包,可观察到无结果 输入observe-port interface g 2/0/0 命令配置观察端口 输入mirror to observe-port both命令 (其中both表示接收来去的数据包,inboun…...
STM32——I2C通讯(软件模拟)
I2C概念 I2C:Inter-Integrated Circuit(内部集成电路) Philps公司80年代初期开发的,引脚少,硬件实现简单,可扩展性广泛地使用在系统内多个集成电路(IC)间的低速通讯 简单的双向两线制总线协议…...
JetBrains Terminal 又发布新架构,Android Studio 将再次迎来新终端
不到一年的时间,JetBrains 又要对 Terminal 「大刀阔斧」,本次发布的新终端是重构后的全新的架构,而上一次终端大调整还是去年 8 月的 v2024.2 版本,并且在「Android Studio Ladybug | 2024.2.1」也被引入。 不知道你们用不用内置…...
论文:Generalized Category Discovery with Large Language Models in the Loop
论文下载地址:Generalized Category Discovery with Large Language Models in the Loop - ACL Anthology 1、研究背景 尽管现代机器学习系统在许多任务上取得了优异的性能,绝大多数都遵循封闭世界的设置,假设训练和测试数据来自同一组预定义…...
第十六届蓝桥杯 省赛C/C++ 大学B组
编程题目现在在洛谷上都可以提交了。 未完待续,写不动了。 C11 编译命令 g A.cpp -o A -Wall -lm -stdc11A. 移动距离 本题总分:5 分 问题描述 小明初始在二维平面的原点,他想前往坐标 ( 233 , 666 ) (233, 666) (233,666)。在移动过程…...
从输入URL到页面渲染:浏览器请求的完整旅程解析
🌐 从输入URL到页面渲染:浏览器请求的完整旅程解析 #网络协议 #浏览器原理 #性能优化 #Web开发 一、概览:一次请求的9大关键阶段 1. 用户输入URL → 2. DNS解析 → 3. 建立TCP连接 → 4. 发送HTTP请求 5. 服务器处理 → 6. 接收响应 → 7…...
【计网】网络交换技术之分组交换(复习自用,重要1)
复习自用的,处理得比较草率,复习的同学或者想看基础的同学可以看看,大佬的话可以不用浪费时间在我的水文上了 另外两种交换技术可以直接点击链接访问相关笔记: 电路交换 报文交换 一、分组交换的定义 1.定义 分组交换&#x…...
