目录
2. 为什么需要 using namespace std; ?
前言
最近这段时间也是开始接触C++了,同时也在接触数据结构,真的是比较忙啊,过俩天在更新《数据结构杂谈》的内容,今天先更新C++的。目前我学习C++的方式主要是看书,在B站大学里学习文章后半段内容会推荐一些C++的书籍,感兴趣的可以看一下。
我特别想跟大家分享一下我的学习心得。今天,我将用最通俗易懂的语言,带你们走进C++的奇妙世界,让C++不再那么神秘莫测。无论你是编程小白,还是刚接触过一点编程,这篇博客都会让你对C++有一个全新的认识。

一、C++是什么?为什么值得学习?
1. C++的"前世今生"
C++可不是突然冒出来的,它的故事要从1979年说起。当时,一位叫Bjarne Stroustrup(本贾尼·斯特劳斯特卢普)的程序员在贝尔实验室工作。他发现C语言在处理复杂项目时有点"力不从心",就像用一把小刀去砍大树,虽然能砍,但效率太低。
于是,他决定在C语言的基础上,增加一些"魔法",让编程变得更高效、更有趣。1983年,他把这种新语言命名为"C++"("++"表示递增,寓意C语言的升级版)。
C++的诞生,就像给程序员们配了一把"瑞士军刀",既有C语言的高效,又有面向对象编程的优雅。它就像一个全能选手,能胜任各种编程任务。
2. C++为什么这么重要?
C++在编程界的地位,就像"老大哥"一样重要。我们来看看它的应用领域:
- 游戏开发:几乎所有主流游戏引擎(如Unreal Engine、Unity)都是用C++写的
- 音视频处理:FFmpeg、WebRTC等音视频处理库都是C++实现的
- 系统软件:操作系统(Windows、Linux)、编译器、数据库等核心系统
- 金融交易:高频交易系统对性能要求极高,C++是首选
- 嵌入式系统:智能手表、扫地机器人、车载系统等
二、“Hello,world”
2.1. C++和C语言的关系
C++兼容C语言的绝大多数语法,所以C语言的"Hello World"在C++中也能运行。但是C++有自己的输入输出方式,更现代化、更方便。
// C语言的Hello World
#include <stdio.h>
int main() {
printf("Hello World\n");
return 0;
}
// C++的Hello World
#include <iostream>
using namespace std;
int main() {
cout << "Hello World" << endl;
return 0;
}
这里有几个关键点需要解释:
#include <iostream>:C++的输入输出流库,相当于C语言的#include <stdio.h>using namespace std;:使用标准命名空间,让cout、endl等可以直接使用cout:C++的输出流,相当于C语言的printf<<:流插入运算符,用于将数据插入到输出流中endl:换行并刷新缓冲区,相当于C语言的\n
2. 2 为什么C++的输入输出更友好?
C语言的printf和scanf需要手动指定格式,比如printf("%d", a),而C++的cout可以自动识别变量类型:
int a = 10;
double b = 3.14;
cout << a << " " << b << endl; // 输出:10 3.14
这就像C++自带了一个"智能助手",能自动判断你输出的是什么类型,不需要你手动指定格式。
三、命名空间:解决名字冲突的"小助手"
3.1. 为什么需要命名空间?
在C语言中,如果两个文件定义了同名的函数或变量,编译器就会报错,就像两个同学都叫"小明",老师很难区分谁是谁。
// 文件1
int rand = 10;
// 文件2
int rand = 20; // 编译错误:重复定义
C++引入了命名空间(namespace),就像给每个人分配了一个"家庭",在同一个家庭内可以有同名的人,但不同家庭之间不会冲突。
3.2.命名空间怎么用
// 定义命名空间
namespace bit {
int rand = 10;
int Add(int left, int right) {
return left + right;
}
}
int main() {
// 访问bit命名空间中的rand
cout << bit::rand << endl; // 输出:10
// 访问bit命名空间中的Add函数
cout << bit::Add(1, 2) << endl; // 输出:3
return 0;
}
命名空间的三种方式:
指定命名空间访问(推荐):
cout << bit::rand << endl;
using将命名空间中某个成员展开:
using bit::rand;
cout << rand << endl;
展开命名空间中全部成员(不推荐,可能引起冲突):
using namespace bit;
cout << rand<<endl;
四、C++输入输出:比C语言更智能
1. 为什么C++的输入输出更好?
C语言的输入输出需要手动指定格式,比如scanf("%d", &a),而C++的cin可以自动识别变量类型:
int a;
doubie b;
cout << a << b; //能够自动识别 a是 int 型,b是 double型
这就像C++的输入输出自带了"智能识别"功能,不需要你费心指定格式。
2. 为什么需要 using namespace std; ?
C++标准库中的所有函数和对象都放在std命名空间中,比如cout、cin、endl等。using namespace std;就是把std命名空间中的所有内容"导入"到当前作用域,这样我们就可以直接使用cout、cin等,而不需要写std::cout。
提醒:在实际项目中,我们不建议使用
using namespace std;,因为它可能引起名字冲突。但在学习阶段,为了方便,可以暂时使用。
五、缺省参数:让函数调用更灵活
5.1. 什么是缺省参数?
缺省参数是指在函数声明或定义时,给参数指定一个默认值。调用函数时,如果没有指定实参,就使用这个默认值。
#include<iostream>
using namespace std;
void fanc(int a=0,int b=0)
{
cout << "a = "<< a << ",b = "<< b << endl;
}
int main()
{
fanc();
fanc(0);
fanc(0,0);
fanc(9,29);
return 0;
}
运行结果:

2. 缺省参数的规则
- 全缺省:所有参数都有默认值
- 半缺省:部分参数有默认值,但必须从右往左连续缺省
//正确形式,半缺省,从右往左连续
void func(int a,int b =10,int c =20){……}
//错误形式,半缺省,从右往左不连续
void fanc(int a=10,int b,int c =20){……}
六、函数重载:一个名字多种用法
6.1. 什么是函数重载?
函数重载是指在同一个作用域中,可以定义多个同名函数,但它们的参数列表不同(参数个数不同或类型不同)。调用时,编译器会根据传入的参数自动选择合适的函数。
// 参数类型不同
int Add(int left, int right) {
return left + right;
}
double Add(double left, double right) {
return left + right;
}
// 参数个数不同
void f() {
cout << "f()" << endl;
}
void f(int a) {
cout << "f(int a)" << endl;
}
// 参数类型顺序不同
void f(int a, char b) {
cout << "f(int a, char b)" << endl;
}
void f(char b, int a) {
cout << "f(char b, int a)" << endl;
}
6.2. 为什么函数重载这么重要?
函数重载让代码更简洁、更易读。比如,我们想计算两个数的和,不管它们是整数还是浮点数,都可以用Add函数,不需要写AddInt、AddDouble等。
小贴士:记住,返回值类型不同不能作为函数重载的条件。因为调用函数时,编译器无法通过返回值类型来确定调用哪个函数。
七、引用:C++中的"别名"魔法
7.1. 什么是引用?
引用不是新定义一个变量,而是给已存在变量取了一个别名。引用和它引用的变量共用同一块内存空间。
int a=0;
int &b =a; //b是a的一个小名
int &c =a; //c也是a的一个小名
引用的特性:
- 引用在定义时必须初始化
- 一个变量可以有多个引用
- 引用一旦引用一个实体,就不能再引用其他实体
7.2. 引用的使用场景
7.2.1. 引用传参
引用传参可以避免拷贝,提高效率。比如,交换两个变量的值:
void Swap(int &x, int &y) {
int tmp = x;
x = y;
y = tmp;
}
int main() {
int a = 1, b = 2;
Swap(a, b);
cout << "a = " << a << ", b = " << b << endl; // 输出:a = 2, b = 1
return 0;
}
7.2.2. 引用作为返回值
引用可以作为函数的返回值,允许修改被引用的对象。
int &GetMax(int &a, int &b) {
return a > b ? a : b;
}
int main() {
int a = 10, b = 20;
GetMax(a, b) = 30; // 修改a或b中较大的那个
cout << "a = " << a << ", b = " << b << endl; // 输出:a = 10, b = 30
return 0;
}
3. const引用:安全的引用
const引用可以引用常量,也可以引用普通变量,但引用的变量不能被修改。
int a = 10;
const int &ra = a; // ra是a的常引用
// ra = 20; // 错误:不能修改常引用
const引用还特别适合用于函数参数,可以避免不必要的拷贝,同时保证不修改原数据。
void Print(const int &a) {
cout << a << endl;
}
八、inline:提升效率的小技巧
8.1. 什么是inline?
inline是C++中的一个关键字,用于修饰函数,表示这个函数是内联函数。编译器在调用内联函数时,会直接将函数体展开,而不是像普通函数那样建立栈帧。
inline int Add(int x, int y) {
return x + y;
}
8.2. 为什么需要inline?
普通函数调用需要建立栈帧,有额外的开销。对于频繁调用的短小函数,使用inline可以避免这个开销,提高效率。
8.3. inline的注意事项
- inline只是建议,编译器可以选择不展开
- inline不适合递归函数和代码较长的函数
- inline不建议声明和定义分离到两个文件
九、C++学习建议:如何高效学习C++
9.1. 学习难度
C++确实比一些语言难学一些,但不要害怕!它就像一座山,虽然陡峭,但登顶后的风景非常壮丽。
学长经验:C++学习曲线比较陡峭,但一旦掌握了核心概念,后面的路就会顺畅很多。
9.2. 学习建议
- 每节课下来把课堂讲过的样例都练习一遍:动手实践是学习编程的最好方式
- 每节课总结笔记:整理笔记能帮助你加深理解
- 不要死记硬背:理解概念比记忆代码更重要
- 多写代码:编程是实践性很强的技能,多写才能熟练
学习书籍推荐:

- 《C++ Primer》:经典的C++语法书,适合中后期作为参考
- 《STL源码剖析》:从底层实现角度剖析STL,适合中后期学习
- 《Effective C++》:55个C++高效使用条款,适合中后期阅读
结语:C++之旅,从这里开始
C++是一门强大而优雅的编程语言,它既有C语言的高效,又有面向对象的优雅。虽然学习C++有一定难度,但只要坚持下去,你一定会感受到它的魅力。
记住,编程不是一蹴而就的,需要日积月累。不要害怕犯错,每个错误都是成长的机会。就像我当年学习C++时,也经常遇到各种问题,但每次解决一个问题,都让我离目标更近一步。
最后,送给大家一句话:
"编程不是关于你写了多少行代码,而是关于你解决了多少问题。"
希望这篇博客能帮助你开启C++学习之旅。


2524





