C++入门一:C++ 编程概述

一、C 语言与 C++ 的关系:从 “带类的 C” 到独立王国

1.1 血缘关系:C++ 是 C 的 “超级进化版”

  • 起源:C++ 由 Bjarne Stroustrup 在 1980 年代开发,最初名为 “C with Classes”(带类的 C),旨在为 C 语言增加面向对象特性。
  • 后向兼容:C++ 完全兼容 C 语言的语法和特性,C 代码可直接在 C++ 编译器中编译,因此常被称为 “C 的超集”。
  • 本质区别:C 是纯面向过程语言,而 C++ 是多范式语言,支持面向过程、面向对象(OOP)和泛型编程。

1.2 核心定位对比

维度

C 语言

C++

编程范式

面向过程(Procedure-Oriented)

面向对象(OOP)+ 泛型 + 面向过程

设计目标

追求效率(底层开发、嵌入式)

兼顾效率与抽象(大型系统、复杂逻辑)

典型场景

操作系统内核、硬件驱动

游戏引擎、企业级框架、AI 算法实现

二、编程范式:面向过程 vs 面向对象

2.1 面向过程(C 语言核心)

  • 核心思想:将问题拆解为 “步骤”,通过函数调用实现逻辑。
// C语言实现两数相加int add(int a, int b) { return a + b; }int main() { printf("%d", add(1, 2)); }
  • 优点
    • 执行效率高(无额外开销),适合对性能敏感的场景(如单片机开发)。
    • 语法简洁,适合快速实现小规模逻辑。
  • 缺点
    • 数据与操作分离,大型项目难以维护(如修改数据需同步修改多个函数)。
    • 代码复用性低,相同逻辑需重复编写。

2.2 面向对象(C++ 核心)

  • 核心思想:将数据(属性)和操作(方法)封装为 “对象”,通过继承和多态实现复用。
// C++实现计算器类class Calculator {public:int add(int a, int b) { return a + b; }};int main() { Calculator calc; printf("%d", calc.add(1, 2)); }
  • 三大特性
    • 封装:通过class隐藏内部细节,提供统一接口(如calc.add())。
    • 继承:子类复用父类代码(如AdvancedCalculator : public Calculator)。
    • 多态:同一接口支持不同实现(通过虚函数实现运行时动态绑定)。
  • 优点
    • 代码结构清晰,易维护(修改对象内部不影响外部调用)。
    • 高度复用,适合复杂业务逻辑(如游戏中的角色系统、企业级框架设计)。
  • 缺点
    • 类实例化和虚函数调用有轻微性能开销。
    • 学习曲线较陡峭(需理解类、对象、继承等概念)。

三、具体语言特性对比:从语法到机制的差异

3.1 关键字与后缀名

  • 关键字数量
    • C 语言:32 个(如if、for、static)。
    • C++:63 个(新增class、virtual、namespace等面向对象和泛型关键字)。
  • 文件后缀
    • C 源文件:.c(如main.c)。
    • C++ 源文件:.cpp(VS 默认后缀,如main.cpp),部分场景用.cc或.cxx。

3.2 函数定义严格性

  • 返回值
    • C 语言:函数未声明返回值时默认返回int(危险隐式转换)。
// C语言合法,默认返回intfunc() { return 1; }
    • C++:必须显式声明返回值,无返回值需用void。
// C++报错,需显式声明void// func() { return 1; }void func() {}
  • 参数列表
    • C 语言:未声明参数时默认接受任意参数(类型不安全)。
int add(); // 可接受add(1, 2, 3)(未检查参数数量)
    • C++:严格检查参数类型和数量,无参数需声明void。
int add(void); // 仅接受0个参数,调用add(1)报错

3.3 缺省参数与函数重载:C++ 的便捷武器

  • 缺省参数(C 语言不支持):
// 半缺省参数(右侧参数必须全有默认值)void print(int x, int y=10) { printf("%d %d", x, y); }// 调用:print(5); // 等价于print(5, 10)
  • 函数重载(C 语言不支持):
// 同名函数,参数类型/数量不同int add(int a, int b) { return a + b; }double add(double a, double b) { return a + b; }// 调用时自动匹配:add(1, 2) → int版;add(1.5, 2.5) → double版

3.4 const:从 “只读变量” 到 “真正常量”

  • C 语言:const修饰的变量是 “只读变量”,本质是变量,不可作数组下标。
const int MAX = 10;int arr[MAX]; // C语言报错,MAX是变量
  • C++:const修饰的是 “真正常量”,编译期确定值,可作数组下标。
const int MAX = 10;int arr[MAX]; // C++合法
  • 特殊情况:若const变量依赖运行时数据(如const int a = b;),会退化为 C 语言的只读变量。

3.5 引用:比指针更安全的 “别名”

  • 本质:引用是变量的别名,底层实现为指针(反汇编层面与指针一致),但语法更安全(不可为空,不可重新指向)。
int a = 10;int& ref = a; // ref是a的别名,修改ref即修改aref = 20; // a变为20
  • 特殊用法
    • 引用常量:const int& ref = 10;(创建临时量存储 10,避免悬垂引用)。
    • 数组引用:int arr[5]; int(&ref_arr)[5] = arr;(通过引用操作整个数组)。

3.6 内存管理:从函数到运算符的进化

特性

malloc/free(C 语言)

new/delete(C++)

本质

库函数

语言内置运算符

类型安全

需手动类型转换(如(int*)malloc)

自动推导类型,无需转换

初始化

仅分配内存,不初始化

可调用构造函数(如new Class())

释放

仅释放内存

先调用析构函数,再释放内存

异常处理

失败返回 NULL

失败抛出bad_alloc异常

示例

int* p = (int*)malloc(4); free(p);

int* p = new int(10); delete p;

3.7 作用域:从二维到三维的扩展

  • C 语言:仅支持局部作用域和全局作用域,全局符号易冲突(如多个文件定义int x;报错)。
  • C++:新增类作用域和命名空间作用域:
namespace Math { // 命名空间作用域int add(int a, int b) { return a + b; }}class Calculator { // 类作用域public: int add(int a, int b) { return a + b; }};// 调用方式:Math::add(1, 2); 或 Calculator().add(1, 2);

四、为什么先学 C 再学 C++?

4.1 打好面向过程基础

C++ 的 “面向过程” 部分与 C 完全一致,掌握 C 能快速理解函数、指针、数组等底层概念,为学习 C++ 的类和模板打下基础。

4.2 理解性能与抽象的平衡

C 的指针和内存管理让开发者理解底层机制,而 C++ 的类和 STL 建立在这些机制之上,先学 C 能避免 “知其然而不知其所以然”。

4.3 无缝衔接复杂场景

C++ 的模板、异常处理等高级特性需要扎实的 C 语言功底,例如模板推导涉及指针和类型转换,这些都是 C 语言的核心内容。

五、总结:C++ 的核心价值

5.1 一句话概括

C++ 是 C 语言的 “超级增强版”,在保持高效的同时,通过面向对象和泛型编程大幅提升复杂场景的开发效率,是连接底层硬件与上层逻辑的桥梁。

5.2 适合人群

  • C 语言开发者:直接进阶,利用 OOP 简化大型项目开发。
  • 零基础新手:建议先学 C 打基础,再逐步学习 C++ 的类、模板、STL 等特性。

5.3 学习路径

  1. 掌握 C 语言基础(指针、数组、函数)。
  1. 学习 C++ 面向对象(类、继承、多态)。
  1. 进阶泛型编程(模板、STL 容器)。
  1. 探索高级主题(内存管理、异常处理、设计模式)。

C++ 的魅力在于 “既能手写高效底层代码,又能搭建复杂上层架构”,是系统级开发和应用开发的 “全能选手”。从现在开始,开启你的 C++ 之旅吧!

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

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

相关文章

LLM生成文本的 束搜索参数是什么(Beam Search)

LLM生成文本的 束搜索参数是什么(Beam Search) 束搜索(Beam Search)是一种在序列生成任务(如机器翻译、文本生成等)中常用的启发式搜索算法,用于在搜索空间中寻找最优的生成序列。 束搜索的基本概念 在序列生成过程中,每一步都会有多个可能的选择(即候选标记)。 …

Java-多级排序结合thenComparing()

List<User>,user有个字段有值的时候设置1,没值就是null,怎么排序根据这个字段排序? 若要对 List<User> 按照某个字段(如 flag,有值时为 1,无值时为 null)排序,可 以使用 ​​Comparator​​ 结合 null 值处理逻辑。 1. 排序规则说明​​ 假设需求是:…

卷积神经网络(CNN)基础

目录 一、应用场景 二、卷积神经网络的结构 1. 输入层&#xff08;Input Layer&#xff09; 2. 卷积层&#xff08;Convolutional Layer&#xff09; 3. 池化层&#xff08;Pooling Layer&#xff09; 最大池化&#xff08;max_pooling&#xff09;或平均池化&#xff08;…

Android 中集成 Unity 工程的步骤

在 Adroid 项目中集成 Unity 工程,主要步骤如下: 一、前提条件 1、已有一个 Android 工程项目; 2、Unity 工程已导出为 Android 工程,目录大概如下: 二、集成步骤 1、在 Android 工程中导入 Unity 工程的 unityLibrary 模块。 在 Android Studio 中,点击菜单栏 Fil…

热Key问题及其解决方案:Redis高并发场景下的性能优化

目录 一、热Key问题的本质与影响 1.1 什么是热Key&#xff1f; 典型热Key场景&#xff1a; 1.2 热Key造成的技术挑战与业务影响 技术层面影响&#xff1a; 业务层面影响&#xff1a; 二、热Key的科学判定与识别方法 2.1 定量判定标准 QPS集中度指标 资源消耗指标 2.…

2025年智能 ITSM产品推荐

2025年数字经济占GDP比重将突破62%&#xff0c;IT服务管理&#xff08;ITSM&#xff09;系统已成为企业核心竞争力的"数字底座"。根据IDC最新报告&#xff0c;采用AI驱动的智能ITSM系统可使企业运营效率提升41%&#xff0c;故障恢复成本降低58%。本文从智能化水平、产…

动手人形机器人(RL)

1 PPO的讲解 核心步骤&#xff0c;如策略网络和价值网络的定义、优势估计、策略更新、价值更新等基础功能的实现 2 代码构成 可能涉及 初始化&#xff0c;Behavior Clone 3 动手强化学习 import pytorch as torch class actorcritic ##等待补充 4 PD Gains 在机器人学中&…

Mujoco xml模型

Mujoco xml模型 一个例子compileroptionassetmesh default基本使用childclass与class多个class worldbodybody关系inertialjointgeom XML主要分为以下三个部分&#xff1a; < asset> &#xff1a; 用 tag导入STL文件&#xff1b;< worldbody>&#xff1a;用tag定义…

【Redis】背景知识

一、Redis的特性 Redis是一种基于键值对&#xff08;key-value&#xff09;的NoSQL数据库&#xff0c;与很多键值对数据库不同的是&#xff0c;Redis中的值可以是由string&#xff08;字符串&#xff09;&#xff0c;hash&#xff08;哈希&#xff09;&#xff0c;list&#xf…

Redis的used_memory_peak_perc和used_memory_dataset_perc超过90%会怎么样

当Redis的used_memory_peak_perc&#xff08;当前内存占历史峰值的百分比&#xff09;和used_memory_dataset_perc&#xff08;数据集内存占比&#xff09;均超过90%时&#xff0c;可能引发以下问题及风险&#xff1a; 一、used_memory_peak_perc > 90% 的影响 内存交换风险…

嵌入式---灰度传感器

灰度传感器概览 一、定义与核心功能 1. 定义 灰度传感器是一种基于 光反射原理 的光电传感器&#xff0c;通过检测物体表面对入射光&#xff08;多为红外光或可见光&#xff09;的反射强度&#xff0c;将光信号转换为电信号&#xff0c;从而判断目标物体的 灰度值&#xff0…

0303hooks-react-仿低代码平台项目

文章目录 1. 副作用2.其他内置hooks2.1 useEffect2.2 useRef2.3useMemo2.4 useCallback 3.自定义hooks4. 第三方hooks5. hooks使用原则6. hooks闭包陷阱7. 总结结语 1. 副作用 当组件渲染完成时&#xff0c;加载一个Ajax网络请求当某个state更新时&#xff0c;加载一个Ajax网络…

Zephyr、FreeRTOS、RT-Thread 定时器区别分析

一、核心特性对比 特性ZephyrFreeRTOSRT-Thread定时器类型系统定时器&#xff08;k_timer&#xff09;、硬件定时器软件定时器&#xff08;基于系统tick&#xff09;软件定时器、硬件定时器定时模式单次、周期性单次、自动重载&#xff08;周期性&#xff09;单次、周期、自定…

手撕unique_ptr 和 shareed_ptr

文章目录 unique_ptrshared_ptr unique_ptr template<class T> class Unique_ptr { private:T* ptrNULL; public://1、删除默认的拷贝构造函数Unique_ptr(Unique_ptr& u) delete;//2、删除默认的复制构造Unique_ptr& operator(Unique_ptr& u) delete; …

对比 HashMap 和 ConcurrentHashMap 扩容逻辑的差异

HashMap 和 ConcurrentHashMap 在 扩容逻辑 上有明显的差异&#xff0c;尤其是在并发环境下的处理策略&#xff0c;这是它们核心区别之一。 &#x1f9f1; 一、总体对比表&#xff08;JDK 8 为例&#xff09; 特性HashMapConcurrentHashMap线程安全❌ 否✅ 是是否支持并发扩容…

Linux 的准备工作

1.root用户登录 首先讲一下root账户怎么登陆 直接 ssh root 公ip地址就可以了 比如我的是腾讯云的 这个就是公ip 下面所有普通用户的操作都是在root账户下进行的 2.普通用户创建 创建用户指令 adduser 用户名 比如说这个指令 我创建了一个ly_centos的普通用户 3.普通用…

自动变为 VIP 文章

今天突然发现自己写的大部分文章都被自动设为了VIP文章。 我这才想起来以前好像填过一个什么表&#xff0c;说要允许CS-DN把自己写的文章自动设为VIP文章。 我也忘了为啥要允许CSDN动我写的文章了&#xff0c;把几乎所有文章都给设为VIP显然是不合适的&#xff0c;毕竟文章是给…

Vue3+Vite+TypeScript+Element Plus开发-08.登录设计

系列文档目录 Vue3ViteTypeScript安装 Element Plus安装与配置 主页设计与router配置 静态菜单设计 Pinia引入 Header响应式菜单缩展 Mockjs引用与Axios封装 登录设计 登录成功跳转主页 多用户动态加载菜单 文章目录 目录 系列文档目录 文章目录 前言 一、登录mo…

全新二手罗德SMCV100B信号发生器SMBV100A

全新二手罗德SMCV100B信号发生器SMBV100A SMCV100B信号发生器SMBV100A主要特点 适用于广播电视、导航、蜂窝和无线应用的多标准平台 全软件选件定义的矢量信号发生器&#xff0c;具备 5″ 触摸屏 全新的射频信号生成概念&#xff0c;频率范围介于 4 kHz 至 7.125 GHz 输出功率…

spring mvc @ResponseBody 注解转换为 JSON 的原理与实现详解

ResponseBody 注解转换为 JSON 的原理与实现详解 1. 核心作用 ResponseBody 是 Spring MVC 的一个注解&#xff0c;用于将方法返回的对象直接序列化为 HTTP 响应体&#xff08;如 JSON 或 XML&#xff09;&#xff0c;而不是通过视图解析器渲染为视图&#xff08;如 HTML&…