从C到C++——探索C++的基本组成与核心语法

前言

如果你已经掌握了C语言的基本语法,恭喜你,学习C++会变得更加得心应手。C++ 是 C 的超集,不仅继承了 C 的灵活与高效,还引入了强大的面向对象编程思想和现代化语法特性。本篇文章将带你从 C 的基础出发,探索 C++ 的基本组成和核心语法,理解其相对于 C 的增强与改进之处。


一、C到C++:语言特性概览

1. C++的增强与特点

相较于 C,C++ 提供了以下新特性:

  1. 面向对象支持:如类与对象、继承、多态。
  2. 类型安全增强:如 const 修饰符,nullptr 替代空指针。
  3. 标准库扩展:提供了 STL(标准模板库),如容器、算法等。
  4. 新语法特性:如 auto、基于范围的 for 循环。
2. C++ 程序的基本结构

C++ 的程序结构与 C 十分类似,但加入了 namespace 和更灵活的输入输出方式:

​
#include <iostream>  // 标准输入输出头文件

int main() {  
    std::cout << "Hello, C++!" << std::endl;  
    return 0;  
}

​

变化点解析

  • #include <iostream>:C++ 使用 <iostream> 替代 C 中的 <stdio.h>,支持面向对象的输入输出流。
  • std::cout:输出流对象,功能类似于 C 中的 printf,但更易扩展。

二、C++关键语法与C语言的对比

1. 输入与输出

C++ 提供了流式输入输出,相比于 C 的 scanfprintf 更加直观和安全:

​
#include <iostream>

int main() {  
    int age;  
    std::cout << "Enter your age: ";  // 输出提示  
    std::cin >> age;                 // 从标准输入读取数据  
    std::cout << "Your age is: " << age << std::endl;  
    return 0;  
}

​

改进点

  • 无需手动格式化(如 %d 等),自动处理类型匹配。
  • 可链式操作:std::cout << "A" << "B";

2. 常量与类型安全

C++ 引入了 constnullptr,增强了对常量和空指针的处理:

  • 常量
​
const double PI = 3.14159;  
PI = 3.14;  // 错误,const 修饰的变量不可修改  

​
  • 空指针
​
int* ptr = nullptr;  // 替代 C 中的 NULL  
if (ptr == nullptr) {  
    std::cout << "Pointer is null." << std::endl;  
}

​

为什么重要?

  • const 提高代码的可读性和安全性。
  • nullptr 明确了指针的语义,避免了空指针相关的错误。

3. 引用与指针

C++ 引入了引用(reference),提供了更简洁的变量访问方式:

  • 引用的特点
    • 必须初始化,不能改变绑定对象。
    • 更安全且易读,减少了指针操作的复杂性。

示例:引用代替指针传参

​
void swap(int& a, int& b) {  // 使用引用
    int temp = a;  
    a = b;  
    b = temp;  
}

int main() {  
    int x = 10, y = 20;  
    swap(x, y);  // 无需使用地址符  
    std::cout << "x = " << x << ", y = " << y << std::endl;  
    return 0;  
}

​

对比 C 的指针传参

​
void swap(int* a, int* b) {  
    int temp = *a;  
    *a = *b;  
    *b = temp;  
}

​

C++ 中使用引用传参更直观,代码可读性更高。


4. 自动类型推导:auto 关键字

C++11 提供了 auto,可以让编译器推导变量类型:

​
auto x = 10;     // 推导为 int  
auto y = 3.14;   // 推导为 double  
auto z = x + y;  // 推导为 double  

​

优势:减少冗余代码,特别是在定义复杂类型时(如迭代器)。


三、C++中的其他增强特性

1. 命名空间(namespace

为了解决命名冲突问题,C++ 引入了命名空间:

​
#include <iostream>  

namespace Math {  
    const double PI = 3.14159;  
    double square(double x) {  
        return x * x;  
    }  
}

int main() {  
    std::cout << "PI: " << Math::PI << std::endl;  
    std::cout << "Square of 5: " << Math::square(5) << std::endl;  
    return 0;  
}

​

通过命名空间避免了多个模块中的变量或函数名冲突。


2. 基于范围的 for 循环

C++11 简化了循环操作:

​
#include <iostream>  
#include <vector>  

int main() {  
    std::vector<int> numbers = {1, 2, 3, 4, 5};  
    for (int num : numbers) {  
        std::cout << num << " ";  
    }  
    return 0;  
}

​

相比于传统 for 循环,基于范围的循环更简洁且易读。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL数据库】基础总结

目录 前言 一、概述 二、 SQL 1. SQL通用语法 2. SQL分类 3. DDL 3.1 数据库操作 3.2 表操作 4. DML 5. DQL 5.1 基础查询 5.2 条件查询 5.3 聚合函数 5.4 分组查询 5.5 排序查询 5.6 分页查询 6. DCL 6.1 管理用户 6.2 权限控制 三、数据类型 1. 数值类…

【数学】概率论与数理统计(五)

文章目录 [toc] 二维随机向量及其分布随机向量离散型随机向量的概率分布律性质示例问题解答 连续型随机向量的概率密度函数随机向量的分布函数性质连续型随机向量均匀分布 边缘分布边缘概率分布律边缘概率密度函数二维正态分布示例问题解答 边缘分布函数 二维随机向量及其分布 …

mysql中创建计算字段

目录 1、计算字段 2、拼接字段 3、去除空格和使用别名 &#xff08;1&#xff09;去除空格 &#xff08;2&#xff09;使用别名&#xff1a;AS 4、执行算术计算 5、小结 博主用的是mysql8 DBMS&#xff0c;附上示例资料&#xff1a; 百度网盘链接: https://pan.baidu.co…

uniapp 之 uni-forms校验提示【提交的字段[‘xxx‘]在数据库中并不存在】解决方案

目录 场景问题代码结果问题剖析解决方案 场景 uni-forms官方组件地址 使用uniapp官方提供的组件&#xff0c;某个表单需求&#xff0c;单位性质字段如果是高校&#xff0c;那么工作单位则是高校的下拉选择格式&#xff0c;单位性质如果是其他的类型&#xff0c;工作单位则是手动…

【SH】Xiaomi9刷Windows10系统研发记录 、手机刷Windows系统教程、小米9重装win10系统

文章目录 参考资料云盘资料软硬件环境手机解锁刷机驱动绑定账号和设备解锁手机 Mindows工具箱安装工具箱和修复下载下载安卓和woa资源包第三方Recovery 一键安装Windows准备工作创建分区安装系统 效果展示Windows和Android一键互换Win切换安卓安卓切换Win 删除分区 参考资料 解…

苹果电脑怎么清理后台,提升苹果电脑运行速度

苹果电脑以其流畅的系统和高效的性能备受用户青睐&#xff0c;但即使是性能强大的Mac&#xff0c;随着使用时间的增长&#xff0c;也会遇到运行变慢、卡顿的问题。造成这种现象的一个主要原因是后台运行的程序和进程过多&#xff0c;占用了系统资源。那么&#xff0c;苹果电脑怎…

qt 快捷功能 快速生成 setter getter 构造函数 父类虚函数重写 成员函数实现 代码框架 查看父类及父类中的虚函数

qt 快速生成 setter getter 构造函数 父类虚函数重写 成员函数实现 代码框架 1、找到要实现的头文件 2、鼠标移动到在头文件中的类定义的类名上&#xff0c;右键进行选择。 这是插入父类虚函数(父类虚函数重写) 选项弹出来的结果。可以查看到所有父类及父类中的所有的虚函数

2_CSS3 背景 --[CSS3 进阶之路]

CSS3 中的背景属性提供了许多强大的功能来增强网页设计&#xff0c;包括但不限于多背景图像、渐变、背景大小控制等。以下是一些关键的 CSS3 背景属性及其用法示例。 1. 多重背景图像 CSS3 允许你为一个元素设置多个背景图像。这些图像按照它们在 background-image 属性中定义…

C++ ——— 内部类

目录 内部类的概念 内部类的特征 sizeof(外部类) 的大小 内部类的实例化 内部类就是外部类的友元 内部类的概念 如果一个类定义在另一个类的内部&#xff0c;这个内部类就叫做内部类&#xff0c;内部类是一个独立的类&#xff0c;它不属于外部类&#xff0c;更不能通过外…

03_Redis基本操作

1.Redis查询命令 1.1 官网命查询命令 为了便于学习Redis,官方将其用于操作不同数据类型的命令进行了分类整理。你可以通过访问Redis官方网站上的命令参考页面https://redis.io/commands来查阅这些分组的命令,这有助于更系统地理解和使用Redis的各项功能。 1.2 HELP查询命令…

深度解读微软Speech服务:让语音识别走进现实

大家好&#xff0c;今天我们来探讨一个激动人心的技术话题&#xff1a;微软的语音识别服务如何为我们提供强大的语音识别解决方案&#xff0c;特别是在电话录音中识别出不同的说话人。 场景描绘 想象一下&#xff0c;你有一段电话录音&#xff0c;并需要将其中的多个说话人区分…

mapbox基础,expressions表达式汇总

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言二、🍀Expressions简介2.1 expressions 操作符2.1.1 Data expressions2.1.2 Camera expressions2.2 Expressi…

HTML中link的用法

一点寒芒先到&#xff0c;随后&#xff0c;抢出如龙&#xff01; 对于本人而言&#xff0c;这篇笔记内容有些扩展了&#xff0c;有些还未学到的也用上了&#xff0c;但是大概可以使用的明白&#xff0c;坚持下去&#xff0c;相信一定可以建设一个稳固的根基。 该文章为个人成…

宝塔面板 申请证书后 仍然提示不安全

证书显示有效&#xff0c;但是网站显示不安全 导致的原因是引入静态文件使用的是HTTP&#xff0c;查看方法为F12打开console控制台 可以看到静态文件全部都是HTTP 网站采用wordpress搭建&#xff0c;基于问题解决&#xff0c;其他方式搭建也是一样&#xff0c;处理掉所有的H…

Maven 中 scope=provided 和 optional=true 的区别

先说效果&#xff0c;maven依赖声明中加了<scope>provided</scope>&#xff0c;或者加了<optional>true</optional>&#xff0c;从效果上看是一样的&#xff0c;都会中断依赖传递&#xff0c;观察下图&#xff1a; 图中&#xff0c;项目B分别依赖了C和…

Linux标准IOday4

1:思维导图2: 创建2个子进程 父进程负责: 向文件中写入数据 2个子进程负责: 从文件中读取数据 要求: 一定保证1号子进程先读取&#xff0c;2号子进程后读取 使用文件IO去实现 #include <stdio.h>#include <string.h>#include <un…

Spring Boot教程之五十五:Spring Boot Kafka 消费者示例

Spring Boot Kafka 消费者示例 Spring Boot 是 Java 编程语言中最流行和使用最多的框架之一。它是一个基于微服务的框架&#xff0c;使用 Spring Boot 制作生产就绪的应用程序只需很少的时间。Spring Boot 可以轻松创建独立的、生产级的基于 Spring 的应用程序&#xff0c;您可…

ColorGATE 23系列的RIP软件

ColorGATE 23系列的RIP软件。ColorGATE是全球领先的用于无化学胶片生产的RIP软件&#xff0c;以下是对其特点和功能的介绍&#xff1a; 应用领域 适用于柔版、胶版和丝网印刷等领域&#xff0c;利用喷墨打印机进行无化学胶片生产&#xff0c;可应用于高端品质的印刷。 核心技…

Type-C双屏显示器方案

在数字化时代&#xff0c;高效的信息处理和视觉体验已成为我们日常生活和工作的关键需求。随着科技的进步&#xff0c;一款结合了便携性和高效视觉输出的设备——双屏便携屏&#xff0c;逐渐崭露头角&#xff0c;成为追求高效工作和娱乐体验人群的新宠。本文将深入探讨双屏便携…

51单片机 DS18B20温度储传感器

DS18B20温度传感器 64-BITROM&#xff1a;作为器件地址&#xff0c;用于总线通信的寻址&#xff0c;是唯一的&#xff0c;不可更改 SCRATCHPAD&#xff08;暂存器&#xff09;&#xff1a;用于总线的数据交互 EEPROM&#xff1a;用于保存温度触发阈值和配置参数 暂存器 单总线…