【C++初学】C++核心编程(一):内存管理和引用

news2025/4/15 22:27:30

前言

在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 = &a
    ref = 20; // 内部转换为 *ref = 20
    cout << "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;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2334575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(PC+WAP)大气滚屏网站模板 电气电力设备网站源码下载

源码介绍 (PCWAP)大气滚屏网站模板 电气电力设备网站源码下载。PbootCMS内核开发的网站模板&#xff0c;该模板适用于滚屏网站模板、电气电力设备网站源码等企业&#xff0c;当然其他行业也可以做&#xff0c;只需要把文字图片换成其他行业的即可&#xff1b;PCWAP&#xff0c…

笔试专题(九)

文章目录 十字爆破&#xff08;暴力&#xff09;题解代码 比那名居的桃子&#xff08;滑动窗口/前缀和&#xff09;题解代码 分组&#xff08;暴力枚举 优化二分&#xff09;题解代码 十字爆破&#xff08;暴力&#xff09; 题目链接 题解 1. 暴力 预处理 2. 如果单纯的暴…

3 VS Code 配置优化与实用插件推荐:settings.json 详解、CodeGeeX 智能编程助手及插件离线安装方法

1 优化 settings.json 文件 1.1 settings.json 简介 settings.json 是 VS Code 的核心配置文件&#xff0c;用于存储用户的个性化设置和偏好。通过该文件&#xff0c;用户可以自定义和覆盖 VS Code 的默认行为&#xff0c;包括但不限于以下方面&#xff1a; 编辑器外观&#…

TA学习之路——1.6 PC手机图形API介绍

1前言 电脑的工作原理&#xff1a;电脑是由各种不同的硬件组成&#xff0c;由驱动软件驱使硬件进行工作。所有的软件工程师都会直接或者间接的使用到驱动。 定义&#xff1a;是一个图形库&#xff0c;用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序接口&#xff08;API)。…

Matlab 调制信号和fft变换

1、内容简介 Matlab 194-调制信号和fft变换 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略

100M/1000M 以太网静电浪涌防护方案

方案简介 以太网是一种生产较早且广泛应用的局域网通讯方式&#xff0c;同时也是一种协议&#xff0c;其核 心在于实现区域内&#xff08;如办公室、学校等&#xff09;的网络互联。根据数据传输速度的不同&#xff0c;以 太网大致可以划分为几个等级&#xff1a;标准以太网…

C语言中while的相关题目

一、题目引入 以下程序中,while循环的循环次数是多少次? 二、代码分析 首先要明确的一点 while循环是当循环条件为真 就会一直循环 不会停止 while中i是小于10的 说明i可以取到0 1 2 3 4 5 6 7 8 9 进入第一个if判断i小于1为真时执行continue i0是为真的 执行continue 后…

「Unity3D」图片导入选项取消Read/Write,就无法正确显示导入大小,以及Addressable打包无法正确显示的问题

如果在Edit -> Project Settings -> Editor中的“Load texture data on demand”勾选&#xff0c;就会让图片导入设置中&#xff0c;不勾选Read/Write&#xff0c;就无法正确显示纹理的大小数字。 更进一步的问题是&#xff0c;使用Addressable打包的时候&#xff0c; 如…

Xcode为不同环境配置不同的环境变量

一般有三种方式&#xff1a; 一、通过多Target 二、通过scheme,也就是多configurations 三、通过.xcconfig文件 先来看第二种方式&#xff1a;通过scheme,也就是多configurations,包括自定义User-settings 第一步&#xff1a;增加configurations,Xcode默认为我们生成了…

阿里通义实验室发布图片数字人项目LAM,实现高保真重建

简介 LAM项目结合了3D Gaussian Splatting&#xff08;高斯点云渲染&#xff09;和大规模预训练模型的优势&#xff0c;解决了传统头部重建方法效率低、依赖多数据的痛点。其背景源于AI生成内容&#xff08;AIGC&#xff09;领域对实时、高保真3D头像生成的需求&#xff0c;尤其…

镜像端口及观察端口的配置

配好路由器的各个接口的IP PC1ping PC3的IP&#xff0c;在路由器中抓2/0/0端口的包&#xff0c;可观察到无结果 输入observe-port interface g 2/0/0 命令配置观察端口 输入mirror to observe-port both命令 &#xff08;其中both表示接收来去的数据包&#xff0c;inboun…

STM32——I2C通讯(软件模拟)

I2C概念 I2C:Inter-Integrated Circuit&#xff08;内部集成电路&#xff09; Philps公司80年代初期开发的&#xff0c;引脚少&#xff0c;硬件实现简单&#xff0c;可扩展性广泛地使用在系统内多个集成电路&#xff08;IC&#xff09;间的低速通讯 简单的双向两线制总线协议…

JetBrains Terminal 又发布新架构,Android Studio 将再次迎来新终端

不到一年的时间&#xff0c;JetBrains 又要对 Terminal 「大刀阔斧」&#xff0c;本次发布的新终端是重构后的全新的架构&#xff0c;而上一次终端大调整还是去年 8 月的 v2024.2 版本&#xff0c;并且在「Android Studio Ladybug | 2024.2.1」也被引入。 不知道你们用不用内置…

论文:Generalized Category Discovery with Large Language Models in the Loop

论文下载地址&#xff1a;Generalized Category Discovery with Large Language Models in the Loop - ACL Anthology 1、研究背景 尽管现代机器学习系统在许多任务上取得了优异的性能&#xff0c;绝大多数都遵循封闭世界的设置&#xff0c;假设训练和测试数据来自同一组预定义…

第十六届蓝桥杯 省赛C/C++ 大学B组

编程题目现在在洛谷上都可以提交了。 未完待续&#xff0c;写不动了。 C11 编译命令 g A.cpp -o A -Wall -lm -stdc11A. 移动距离 本题总分&#xff1a;5 分 问题描述 小明初始在二维平面的原点&#xff0c;他想前往坐标 ( 233 , 666 ) (233, 666) (233,666)。在移动过程…

【计网】网络交换技术之分组交换(复习自用,重要1)

复习自用的&#xff0c;处理得比较草率&#xff0c;复习的同学或者想看基础的同学可以看看&#xff0c;大佬的话可以不用浪费时间在我的水文上了 另外两种交换技术可以直接点击链接访问相关笔记&#xff1a; 电路交换 报文交换 一、分组交换的定义 1.定义 分组交换&#x…

解密CHASE-SQL和XiYan-SQL多智能体AI如何最终实现TEXT2SQL的突破

想象一个世界,无论技术背景如何,任何人都能轻松查询海量数据库、挖掘深层洞察。比如:“我想知道安徽地区最畅销电子产品的第三季度销售额?”——只需一句话。“去年营销支出与客户获取成本之间的相关性如何?”——像聊天一样输入问题。这就是Text-to-SQL的承诺:将人类语言…

思考力提升的黄金标准:广度、深度与速度的深度剖析

文章目录 引言一、广度的拓展&#xff1a;构建多元知识网络1.1 定义与重要性1.2 IT技术实例与提升策略小结&#xff1a;构建多元知识网络&#xff0c;提升IT领域思考力广度 二、深度的挖掘&#xff1a;追求知识的精髓2.1 定义与重要性2.2 IT技术实例与提升策略小结&#xff1a;…

web自动化:下拉选择框、弹出框、滚动条的操作

web自动化&#xff1a;下拉选择框、弹出框、滚动条的操作 一、下拉选择框 1、导包 from selenium.webdriver.support.select inport Select 2、实例化对象 Select(element) 3、常用方法 通过option索引来定位&#xff0c;从0开始&#xff1a;select_by_index(index)通过…

数字人:打破次元壁,从娱乐舞台迈向教育新课堂(4/10)

摘要&#xff1a;数字人正从娱乐领域的璀璨明星跨界到教育领域的智慧导师&#xff0c;展现出无限潜力。从虚拟偶像、影视游戏到直播短视频&#xff0c;数字人在娱乐产业中大放异彩&#xff0c;创造巨大商业价值。在教育领域&#xff0c;数字人助力个性化学习、互动课堂和虚拟实…