基于C语言上,面向对象语言:C++基础(学完C语言后再看)

大家好,这里是彩妙呀~

当你熟练掌握C语言后,你就可以进入C++的世界啦。而C++并非一门全新的语言,他是C语言的自然演进与扩展,它在保留C语言高效、灵活特性的基础上,引入了**面向对象编程(OOP)**的核心思想。所以,C++不仅仅是一门"C语言+面向对象"的语言,它更是一种编程思维的转变------从过程式编程转向面向对象的设计理念。

在C++中,你将接触到诸多C语言中没有的特性:

  • 命名空间解决命名冲突问题
  • 引用提供更安全的别名机制
  • 输入输出流库简化I/O操作
  • 函数重载提升代码可读性
  • 类、继承、多态等面向对象的核心概念

这些特性使C++成为开发大型、复杂、可维护软件系统的理想选择。

本教程将帮助你从C语言的熟练使用者,顺利过渡到C++的高效开发者。彩妙不会从最基础的语法开始,而是聚焦于C++特有的、能够显著提升编程效率和代码质量的特性,让你能够快速上手并体会到C++带来的编程体验提升。

目录


目录

目录

C++发展历史

C++的版本更新

C++的重要性

编程语⾔排⾏榜

C++在⼯作领域中的应⽤

[1. 大型系统软件开发](#1. 大型系统软件开发)

[2. 音视频处理](#2. 音视频处理)

[3. PC客户端开发](#3. PC客户端开发)

[4. 高性能服务端开发](#4. 高性能服务端开发)

[5. 游戏引擎开发](#5. 游戏引擎开发)

[6. 嵌入式系统开发](#6. 嵌入式系统开发)

[7. 机器学习底层开发](#7. 机器学习底层开发)

[8. 测试与工具开发](#8. 测试与工具开发)

C++学习建议和书籍推荐

C++学习难度

学习建议

经典书籍推荐

避坑指南

我们第一个C++程序

命名空间:namespace

为什么需要命名空间?

命名空间的基本语法

命名空间的核心用途

避免名称冲突(核心价值)

组织代码(提高可读性)

命名空间的高级特性

嵌套命名空间

未命名命名空间

合并同名命名空间

C++输⼊&输出


C++发展历史

C++起源于1979年,由Bjarne Stroustrup(本贾尼·斯特劳斯特卢普)在贝尔实验室开发。面对软件开发任务(如模拟和操作系统),他认识到C语言在表达能力、可维护性和可扩展性方面的不足。

Bjarne Stroustrup c++之父-百度百科

1983年,Stroustrup在C语言基础上添加了面向对象特性,包括类、封装和继承等核心概念,并正式命名为C++。该语言为面向对象编程奠定了基础。

随后几年,C++在学术界和工业界应用迅速扩展。大学和研究机构将其作为教学工具,企业也开始在产品开发中采用。同时,C++的标准库和模板等特性得到完善。

1989年,C++标准化工作启动,由ANSI和ISO联合委员会负责。1994年,委员会提出首个标准化草案,并决定纳入STL(Standard Template Library)。STL由惠普实验室开发,扩展了C++的功能,但延缓了标准化进程。

1997年11月14日,委员会通过最终草案。1998年,C++的ANSI/ISO标准正式发布。

C++的版本更新

版本 年份 主要内容
C++98 1998 作为C++的首个标准化版本,引入了标准模板库(STL),支持容器(如vectorlist)、算法(如sortfind)和迭代器,显著提升了语言的功能性和易用性。
C++03 2003 主要对C++98进行错误修正和功能微调,并引入技术报告1(TR1),提供shared_ptrunordered_map等实用组件,为后续版本奠定基础。
C++11 2011 重大更新版本,新增lambda表达式、自动类型推导(auto)、范围for循环、移动语义、右值引用、标准线程库(<thread>)和智能指针(如unique_ptrshared_ptr),大幅提升现代化水平和编程效率。
C++14 2014 对C++11的增强与优化,引入泛型lambda、返回类型后置、二进制字面量、std::make_unique等特性,进一步完善核心功能。
C++17 2017 新增ifswitch初始化器、结构化绑定、std::variantstd::optionalstd::any及文件系统库(<filesystem>),强化语言表达能力和标准库功能。
C++20 2020 里程碑式更新,引入协程、概念(concepts)、模块、范围、三路比较等特性,为现代化编程提供强大支持。
C++23 2023 进一步完善现有特性,新增if constevalstd::expectedstd::flat_map等,提升编译时表达能力和标准库实用性。
C++26 2026 目前处于制定阶段,特性尚未确定,预计在先前版本基础上引入新语言特性和标准库功能,持续优化现代化水平和编程体验。

C++参考⽂档:
早期C++参考网站,内容较陈旧
当前主流选择:
社区维护的最新、最全面的C++参考文档(英文)
社区维护的最新、最全面的C++参考文档 (中文)

C++的重要性

编程语⾔排⾏榜

TIOBE排行榜通过统计互联网上有经验的程序员、课程和第三方厂商的数量,并利用搜索引擎(如Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube和Baidu(百度)等平台的数据,来生成编程语言的排名。该排行榜仅反映编程语言的受欢迎程度,不能用于评价一门语言的优劣,也不能说明其编写的代码总量。

TIOBE 指数 2025 年 10 月排行榜公布

C++在⼯作领域中的应⽤

C++凭借其高性能、内存控制能力和跨平台特性,已成为众多关键领域的核心开发语言,广泛应用于以下场景:

1. 大型系统软件开发

C++是构建底层系统软件的首选语言,包括编译器(如GCC、Clang)、数据库系统(如MySQL、PostgreSQL)、操作系统(如Linux内核部分模块)和浏览器引擎(如Blink、Gecko)等。

2. 音视频处理

C++是音视频处理领域的绝对主力,主流开源库如FFmpeg、WebRTC、Mediasoup和ijkplayer均基于C++开发。音视频编解码、流媒体传输和实时通信等核心技术均依赖C++的高性能特性。

3. PC客户端开发

在Windows桌面应用开发中,C++与QT框架的组合是主流技术栈。QT作为跨平台GUI框架,使开发者能够高效构建高性能桌面应用,如WPS Office等商业软件。

4. 高性能服务端开发

在对性能要求严苛的场景中,C++成为服务端开发的首选,尤其适用于:

  • 游戏后端服务(高并发、低延迟)

  • 流媒体服务(如视频点播、直播平台)

  • 量化高频交易系统(毫秒级响应需求)

5. 游戏引擎开发

几乎所有主流游戏引擎均采用C++开发,如Unreal Engine 4/5、Cocos2d-x和Godot。游戏开发需要扎实的C++基础、数据结构知识,并深入理解图形学和引擎架构。

6. 嵌入式系统开发

C++在嵌入式领域应用广泛,涵盖:

  • 嵌入式应用开发(智能手环、智能音箱、车载系统)

  • 嵌入式驱动开发(硬件抽象层、设备驱动)

  • 机器人控制(扫地机器人、无人机等)

7. 机器学习底层开发

机器学习框架的底层实现(如TensorFlow、PyTorch的核心计算库)主要采用C++编写,上层接口则通过Python封装。若需参与框架开发或性能优化,C++是必备技能。

8. 测试与工具开发

在软件质量保障领域,C++常用于开发高性能测试工具:

  • 自动化测试框架(如基于C++的测试工具)

  • 性能测试工具(高吞吐量测试场景)

  • 测试基础设施开发(如测试执行平台)

C++学习建议和书籍推荐

C++学习难度

C++的学习曲线确实较为陡峭,但通过科学的方法和持续的实践,完全可以掌握这门强大的语言。

学习建议

  1. 循序渐进,打好基础:不要急于学习模板元编程等高级特性,前3个月应专注于基础语法、指针和内存管理。C++的"指针"和"内存管理"是两大核心难点,建议通过小项目反复练习。

  2. 实践优先:每天至少编写50行代码,坚持6个月以上。不要只看不写,通过实践才能真正理解概念。从简单的命令行工具开始,逐步过渡到更复杂的项目。

  3. 善用现代C++特性:从C++11开始,C++提供了大量现代化特性(如智能指针、lambda表达式),这些能显著提高代码质量和开发效率。不要被"传统C++"的写法束缚。

  4. 善用调试工具:掌握GDB或IDE内置调试器,学会通过调试器观察程序执行状态,这是排查复杂问题的关键技能。

  5. 加入学习社区:加入C++学习社群(如Stack Overflow的C++标签、GitHub上的C++开源项目),与他人交流能解决很多困惑,也能获得持续学习的动力。

经典书籍推荐

  1. 《C++ Primer》(第5版) - 基础语法和面向对象编程的最佳入门书籍,内容全面,适合系统学习。

  2. 《Effective C++》(第3版) - "C++圣经"之一,提供50个具体建议,帮助你写出更高效、更安全的C++代码。

  3. 《C++标准库》(第2版) - 深入理解STL的实用指南,对使用标准库非常有帮助。

  4. 《C++11/14/17/20新特性》 - 专注于现代C++特性的实用指南,帮助你快速掌握C++的现代化写法。

  5. 《C++并发编程实战》 - 专门讲解多线程和并发编程的权威书籍,对高性能服务端开发至关重要。

避坑指南

  • 避免过早接触高级特性:在掌握基础之前,不要深入模板元编程或复杂的内存管理技巧。
  • 不要依赖IDE自动补全:理解语言本质比依赖IDE更关键。
  • 重视代码风格:C++的代码风格对可读性和维护性影响巨大,建议遵循Google C++风格指南。
  • 选择合适的工具链:统一使用VS2022或CLion等现代IDE,避免环境配置带来的额外困扰。

我们第一个C++程序

C++兼容C语⾔绝⼤多数的语法,所以C语⾔实现的hello world依旧可以运⾏,C++中需要把定义⽂件 代码后缀改为.cpp,vs编译器看到是.cpp就会调⽤C++编译器编译,linux下要⽤g++编译,不再是gcc。

cpp 复制代码
//c语言写法
#include<stdio.h>

int main()
{
printf("hello world\n");
return 0;
}

//c++写法

#include<iostream>
using namespace std;

int main()
{
cout << "hello world\n" << endl;
return 0;
}

这里我们可以发现:库与输出函数不一样,并且还有 using namespace std 这条新语句。下面,我会带着大家来了解一下学习c++时,对C语言的变化以及新玩意吧。

命名空间:namespace

为什么需要命名空间?

在C语言中,我们通常会把所有的标识符(变量,函数,类型等等)都定义于全局命名空间中,这样就会有一个问题:命名冲突

cpp 复制代码
#include <iostream>
#include <第一个库>
#include <第二个库>

//  两个库均有fun1()



int main()
{
    fun1();    //在此处调用就会有歧义,

return 0;
}

在c++中,为了避免这个问题,就引入命名空间这个机制:为标识符提供了一个逻辑上的"容器" ,就像给不同的代码**"打包",**避免了名称冲突。

命名空间的基本语法

命名空间,本质上是一个域。而定义一个命名空间,实际上就是定义一个域名:namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量。学习过C语言的都知道,函数,变量都有自己的生命周期,在域中被使用,随着域的消亡而消亡。所以,在C++中域有函数局部域,全局域,命名空间域,类域。

域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响 编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。

定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。

cpp 复制代码
#include <iostream>
// 定义一个名为MyLib的命名空间
namespace MyLib {
    int value = 10;
    
    // 定义一个类
    class MyClass {
    public:
        void print() { 
            std::cout << "Hello from MyLib!" << std::endl; 
        }
    };
    
    // 定义一个函数
    void greet() {
        std::cout << "Welcome to MyLib!" << std::endl;
    }
}

int main()
{
//访问命名空间中的成员


// 1. 完全限定名(推荐在头文件中使用)
MyLib::value = 20;
MyLib::MyClass obj;
obj.print();

// 2. using声明(引入单个标识符)
using MyLib::MyClass;
MyClass obj2;
obj2.print();

// 3. using指令(引入整个命名空间,推荐在.cpp文件中使用)
using namespace MyLib;
greet(); // 不需要MyLib::前缀

}

命名空间的核心用途

避免名称冲突(核心价值)

就如我上述所说:命名空间最主要解决的是相同标识符所引发的问题,使用命名空间就很有效避免这一问题

cpp 复制代码
// 同名函数,但属于不同命名空间


// 文件1:my_math.h
namespace Math {
    int add(int a, int b) { return a + b; }
}

// 文件2:my_string.h
namespace String {
    int add(int a, int b) { return a + b; } 
}

// 文件3:main.cpp
#include "my_math.h"
#include "my_string.h"

int main() {
    Math::add(10, 20);    // 10+20=30

    String::add(5, 15);   // 5+15=20
    return 0;
}
组织代码(提高可读性)

将相关功能的代码组织在一起,使代码结构更清晰:

cpp 复制代码
namespace Graphics {
    namespace Rendering {
        void renderScene();
    }
    
    namespace Input {
        void handleInput();
    }
    
    namespace Geometry {
        class Vector3D { /* ... */ };
    }
}

在未来工作中,通常情况下会分配组员与组长,那么可能会出现一种需求不同实现的情况。在这里,命名空间就起到非常大的作用:在特定的情况来使用特定的解决方案,即使会出现标识符相同,也可以通过命名空间来让人与编译器识别开。

而是域展开,则需要使用using 来使域扩充为全局域(C++标准库的所有内容都定义在std命名空间中,而为了方便,则使用using namespace std来使这个域展开)。

命名空间的高级特性

嵌套命名空间
cpp 复制代码
namespace Company {
    namespace Product {
        namespace Version {
            const int VERSION = 1;
        }
    }
}

// 使用
int version = Company::Product::Version::VERSION;



//C++17简化了嵌套命名空间的语法
namespace Company::Product::Version {
    const int VERSION = 1;
}
未命名命名空间
cpp 复制代码
namespace {
    int secret_value = 42; // 仅在当前文件可见
}

// 在其他文件中无法访问secret_value
合并同名命名空间

C++允许在多个文件中声明同一个命名空间,编译器会自动合并它们:

cpp 复制代码
// file1.h
namespace App {
    void init();
}

// file2.h
namespace App {
    void shutdown();
}

// file3.cpp
#include "file1.h"
#include "file2.h"

void App::init() { /* ... */ }
void App::shutdown() { /* ... */ }

C++输⼊&输出

在写我们第一个程序时,会注意到:头文件变成了<iostream>,那么,这个库就是C++的标准输入输出流:Input Output Stream 的缩写。他定义了标准的输入与输出对象。

std::cin就是istream类的对象,它主要⾯向窄字符(narrow characters (of type char))的标准输
⼊流。 对标C语言的scanf()函数,但与scanf()相比,cin使用更加丝滑:

cpp 复制代码
  int i;
  float fl;
  char* str;

  scanf("%d %f %s ", &i ,&fl, &str);


  std::cin >> i >> fl >> str;

std::cout就是ostream类的对象,它主要⾯向窄字符的标准输出流。对标C语言的printf()函数,但与printf()相比,cout使用更加顺畅:

cpp 复制代码
  int i;
  float fl;
  char* str;

  scanf("%d %f %s ", &i ,&fl, &str);


  std::cin >> i >> fl >> str;


prinft("%d %f %s",i ,fl ,str);

cout << i << fl <<str;

std::endl 是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区。

注意:

  • C++的输⼊输出可以⾃动识别变量类型
  • 使用cin来写入数据时,要使用 >> ,cout要使用 << :<< 是流插⼊运算符,>> 是流提取运算符。(C语⾔还⽤这两个运算符做位运算左移/右移)
  • cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要通过命名空间的使⽤⽅式去⽤他们。而在⼀般⽇常练习中我们可以using namespace std,实际项⽬开发中不建议using namespace std。
  • 这⾥我们没有包含<stdio.h>,也可以使⽤printf和scanf,在包含<iostream>间接包含了。vs系列编译器是这样的,其他编译器可能会报错。
    IO流涉及类和对象,运算符重载、继承等很多面向对象的知识,这些知识我们还没有讲解,所以这
    ⾥我们只能简单认识⼀下C++ IO流的⽤法,后⾯彩妙会有专⻔的⼀篇博客来细节IO流库。

本篇博客在这里就结束啦,后续彩妙会继续给大家讲解有关C++一些新特性,以及其最重要的使用:面向对象,stl模版的使用以及封装继承多态等。关注彩妙,获取更多优质好文吧~

相关推荐
艾莉丝努力练剑6 小时前
【Linux权限 (二)】Linux权限机制深度解析:umask如何决定默认权限与粘滞位的妙用
大数据·linux·服务器·c++·ubuntu·centos·1024程序员节
脸大是真的好~6 小时前
黑马JAVA+AI 加强07 Stream流-可变参数
java·开发语言
m0_736927046 小时前
使用 Python 将 PowerPoint 转换为 Word 文档
java·开发语言·后端·职场和发展·c#
杜子不疼.7 小时前
【Rust】路由匹配与参数提取:从 match 语句到 axum 的类型魔法
开发语言·后端·rust
夜晚中的人海7 小时前
【C++】位运算算法习题
开发语言·c++·算法
裸奔在上海7 小时前
使用Java做URL短连接还原长链接获取参数
java·开发语言·程序人生·spring
爱吃烤鸡翅的酸菜鱼7 小时前
如何掌握【Java】 IO/NIO设计模式?工厂/适配器/装饰器/观察者模式全解析
java·开发语言·后端·设计模式·nio
程序员大雄学编程7 小时前
「用Python来学微积分」17. 导数与导函数
开发语言·python·数学·微积分
扶尔魔ocy7 小时前
【QT常用技术讲解】可拖拽文件的Widget--QListWidget
开发语言·qt