news 2026/4/30 3:24:23

C++超详细梳理基础知识

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++超详细梳理基础知识

命名空间的使用

来源

在了解命名空间的原理和使用之前,我们先要理解,命名空间是为了解决什么问题。

C++是在C的基础上发展而形成的一种语言,完全兼容C的语法,也加入了许多新的规则和语法来解决C的缺陷。

命名空间就是为了解决C语言中的重复命名的问题。

首先我们来看看这么一个代码:

1

2

3

4

5

6

7

#include<stdio.h>

intmain()

{

intscanf= 20;

printf("%d",scanf);

return0;

}

我们都知道scanf在C之中是一个函数名,但诡异的是我们在主函数中声明scanf是有效的并且输出结果是20.

在这个程序内的scanf就是表示是一个int型整数,这是根据就近原则或者说是局部优先原则确定的。

接下来我们看看另一个程序:

1

2

3

4

5

6

7

8

#include<stdio.h>

intmain()

{

intscanf= 20;

scanf("%d", &scanf);

printf("%d",scanf);

return0;

}

在我们想要scanf作为函数使用时出现了问题,两者之间命名冲突。

在C语言中我们被告诫不要让变量名与函数名冲突,但是在C++中有没有合适的解决方法呢?

命名空间的使用

我们先来书写一个在C++中最为简单的程序:

1

2

3

4

5

6

7

#include<iostream>

usingnamespacestd;

intmain()

{

cout <<"hello world"<< endl;

return0;

}

这里我们就看到了namespace命名空间,但是现在它是用来干什么的我们还不清楚,首先我们先来了解一下它。

一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。

让我们从代码方面来看看命名空间到底是什么:

1

2

3

4

5

6

7

8

9

10

11

12

13

#include<iostream>

usingnamespacestd;

namespaceN1

{

intprintf= 30;

intstrlen= 20;

}

intmain()

{

cout <<"hello world"<< endl;

cout << N1::printf<< endl;

return0;

}

我们声明了一个命名空间N1,在内部声明了两个int类型的变量,通过作用域限定符::我们就可以调用命名空间中的变量。

并且命名空间中也可以嵌套命名空间:

1

2

3

4

5

6

7

8

9

namespaceN1

{

intprintf= 30;

intstrlen= 20;

namespaceN2

{

inta = 0;

}

}

通过上面的解释,我们明白了,命名空间适用于将声明的名称之间相互隔离,防止命名冲突。比如说,我们调用N1::printf时,::将范围限定在N1这个命名空间之中,而不会与函数名printf冲突,反之亦然。

那么一开始我们看到的那个程序是什么意思呢?

我们先来看另一个版本的程序:

1

2

3

4

5

6

intmain()

{

std::cout <<"hello world"<< std::endl;

//cout << N1::printf << endl;

return0;

}

显然std也是一个命名空间,通过作用域限定符调用命名空间std内的内容。

那么一开始的

1

usingnamespacestd;

是用来干嘛的呢?

using的作用是把命名空间中的内容在全局空间中展开,命名空间中的变量就成为了全局变量,调用时就不需要命名空间名加上作用域限定符了。

实际上命名空间有三种使用方式,各有优劣。

不展开

也就是

1

std::cout <<"hello world"<< std::endl;

的方式,要使用命名空间中的名称,就要使用::来限定命名空间,完全避免了冲突,在大工程中使用。缺点就是在日常练习中书写代码较为繁琐。

部分展开

使用using将命名空间中成员引入,将一些我们常用的符号在全局中展开,就可以大大简化代码,是在第一个方法和第三个方法之间取一个折中。

1

2

3

4

5

6

7

8

usingstd::cout;

usingstd::endl;

intmain()

{

cout <<"hello world"<< endl;

//cout << N1::printf << endl;

return0;

}

全展开

使用using namespace 命名空间名称引入:

1

2

3

4

5

6

7

usingnamespacestd;

intmain()

{

cout <<"hello world"<< endl;

//cout << N1::printf << endl;

return0;

}

这个方法是有问题的,相当于一夜回到解放前。好不容易搞个命名空间隔离了,结果一行代码全给展开了,直接在全局空间声明,完全没有防止命名冲突的作用,只在日常练习中使用。

函数重载

函数重载的规则

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。

比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!”

函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数 个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。

比如下面的相加函数:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

intAdd(intleft,intright)

{

returnleft+right;

}

doubleAdd(doubleleft,doubleright)

{

returnleft+right;

}

longAdd(longleft,longright)

{

returnleft+right;

}

intmain()

{

Add(10, 20);

Add(10.0, 20.0);

Add(10L, 20L);

return0;

}

虽然函数名相同,但是所带参数的类型不同,所以在调用的时候能够调用不同的函数定义,让函数的使用更加灵活。

这里要特别注意的是函数重载的规则:同名函数的形参列表(参数 个数 或 类型 或 顺序)必须不同。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 3:23:44

游戏AI智能体开发实战:从强化学习原理到Rainy-Aether-Insiders平台应用

1. 项目概述&#xff1a;当AI遇上游戏&#xff0c;一场关于智能体的“雨夜”实验最近在GitHub上闲逛&#xff0c;发现了一个名为enosislabs/rainy-aether-insiders的项目。这个标题本身就充满了故事感——“雨夜”、“以太”、“内部人士”&#xff0c;组合在一起&#xff0c;像…

作者头像 李华
网站建设 2026/4/30 3:17:38

挖到一个好用的双语字幕插件

讯飞同传双语字幕插件是依托科大讯飞核心语音识别与翻译技术打造的AI辅助工具&#xff0c;核心定位是打破跨语言沟通壁垒&#xff0c;为多场景提供实时、精准的双语字幕支持&#xff0c;适配个人、企业及专业场合的多样化需求&#xff0c;其核心功能、适配场景及实用特点如下&a…

作者头像 李华
网站建设 2026/4/30 3:11:22

不只是扫一扫:用Python PIL库把二进制字符串‘画’成二维码的几种方法

不只是扫一扫&#xff1a;用Python PIL库把二进制字符串‘画’成二维码的几种方法 在数据可视化的世界里&#xff0c;二维码早已超越了简单的扫码功能。当我们需要将一长串二进制数据直观呈现时&#xff0c;将其转换为二维码图像不仅美观&#xff0c;还能保留原始数据的可读性。…

作者头像 李华
网站建设 2026/4/30 3:07:21

Windows开发者的Podman避坑实录:从WSL安装失败到成功运行第一个容器

Windows开发者的Podman避坑实录&#xff1a;从WSL安装失败到成功运行第一个容器 第一次在Windows上尝试Podman时&#xff0c;我本以为按照官方文档一步步操作就能轻松搞定。没想到从WSL安装到Podman初始化&#xff0c;每一步都暗藏玄机。这篇文章记录了我踩过的坑和最终验证有…

作者头像 李华