news 2026/5/14 5:21:09

C语言向C++过渡

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言向C++过渡

.命名空间的引入

首先看一段代码

代码语言:javascript

AI代码解释

#include <stdio.h> int rand = 10; int main() { printf("%d\n", rand); return 0; }

编译并不会报错,但如果加上头文件stdlib呢?

在这里插入图片描述

编译器告诉我们,rand重定义了,以前的定义是变量,而在stdlib这个库中,rand是一个函数,将头文件展开变量rand会和库里面的rand函数冲突 我们在编码时,会创建很多的变量、函数,我们并不能保证每个变量和函数都不能同名,或者是不和库中的函数重名,所以我们引入关键字namespace,基本格式如下:

代码语言:javascript

AI代码解释

namespace name { }

namespace的本质是定义一个命名空间域,避免头文件展开后会和库函数冲突,这个域跟全局域各自独立,不同的域可以定义同名变量

代码语言:javascript

AI代码解释

#include <stdio.h> #include <stdlib.h> // 引入namespace进行命名隔离 namespace Vect { int rand = 0; } int main() { printf("%d", Vect::rand); return 0; }

编译通过:

在这里插入图片描述

下面介绍namespace的一些性质

1.1.namespace的性质
  • 不影响变量/函数的生命周期,仅作名字的隔离作用
  • namespace只能定义在全局,可以嵌套定义,多文件下同名的命名空间会进行合并

代码语言:javascript

AI代码解释

#include <stdio.h> #include "head1.h" namespace Vect { // 1. 命名空间可以定义变量/函数/类型 int num = 10; int* ptr = &num; void Print() { printf("HELLO,C++!\n"); } struct node { int val; struct node* next; }; // 2. 命名空间可以嵌套定义 namespace coke { // ... } } int main() { return 0; }
1.2.namespace的使用

编译器在编译时,会按照一定的顺序进行查找变量/函数/类型 1. 局部域,通俗理解是自己家 2. 全局域,通俗理解是公共区域;展开的命名空间(别人家声明你可访问),这两个域相同优先级

而查找命名空间也有三种方式:

  1. using将命名空间中某个成员展开,项目中推荐这种方式
  2. 使用域作用限定符::指定查找
  3. using展开全部的命名空间,项目中非常不推荐,日常练习无所谓

代码语言:javascript

AI代码解释

#include <stdio.h> // 使用方法 // 1.域作用限定符指定访问 int num = 10; namespace Vect { int num = 0; char ch = '?'; } int main() { printf("%d\n", Vect::num); printf("%c\n", Vect::ch); // 若域作用限定符左边无命名空间,默认查找全局域 printf("%d\n", ::num); printf("%d\n", num); }

在这里插入图片描述

代码语言:javascript

AI代码解释

// 2. using展开局部对象 namespace Vect { int num = 0; char ch = '?'; } using Vect::num; int main() { printf("%d\n", num); printf("%c\n", Vect::ch); // 若域作用限定符左边无命名空间,默认查找全局域 }

![[Pasted image 20250626191832.png]]

代码语言:javascript

AI代码解释

// 3. using展开全体对象 namespace Vect { int num = 0; char ch = '?'; } using namespace Vect; int main() { printf("%d\n", num); printf("%c\n", ch); // 若域作用限定符左边无命名空间,默认查找全局域 }

在这里插入图片描述

思考:局部域、全局域、命名空间域有什么联系和区别局部域、全局域和命名空间域是 C++ 中三种作用域:

  • 局部域:在函数或代码块内部,只在当前块内有效。
  • 全局域:定义在所有函数外部,整个程序都能访问,可能需要注意extern
  • 命名空间域:用来组织代码,防止命名冲突,通过namespace::变量展开局部变量或者全部展开三种方式访问。

三者的区别在于作用范围和访问方式,它们之间可以嵌套使用,但同名时,遵循局部优先原则,命名空间通过域作用限定符来区分。实际开发中,我们倾向使用局部变量和命名空间来增强代码的可读性和安全性,尽量少使用全局变量。

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

【C++ 】模板初阶:从 “重复造轮子” 到通用代码

函数模板1. 基本语法函数模板的定义需以template关键字开头&#xff0c;后跟模板参数列表&#xff0c;语法格式如下&#xff1a;代码语言&#xff1a;javascriptAI代码解释template<typename T1, typename T2, ..., typename Tn> 返回值类型 函数名(参数列表) {// 函数体…

作者头像 李华
网站建设 2026/5/14 5:18:06

实测Taotoken多模型聚合服务的响应延迟与稳定性观感

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 实测Taotoken多模型聚合服务的响应延迟与稳定性观感 1. 引言 在将大模型能力集成到实际应用的过程中&#xff0c;开发者除了关注模…

作者头像 李华
网站建设 2026/5/14 5:17:07

ARM架构TLB失效机制与TLBI VALE1OS指令详解

1. ARM架构TLB失效机制概述在ARM架构的处理器中&#xff0c;TLB&#xff08;Translation Lookaside Buffer&#xff09;是内存管理单元&#xff08;MMU&#xff09;的关键组件&#xff0c;用于缓存虚拟地址到物理地址的转换结果。当操作系统修改页表后&#xff0c;必须确保所有…

作者头像 李华
网站建设 2026/5/14 5:17:06

智能抠图怎么操作?2026年最全工具对比指南,一键去背景其实很简单

最近有个朋友问我&#xff0c;怎么才能快速给商品图去掉背景&#xff0c;做个透明背景的图片用来做海报。说实话&#xff0c;这个需求我也经常遇到——不管是做自媒体内容、制作证件照&#xff0c;还是处理电商图片&#xff0c;智能抠图这个需求真的很日常。我就想着&#xff0…

作者头像 李华
网站建设 2026/5/14 5:12:08

腾讯面试官问:Chunk 到底该怎么切?

别再背 500 tokens overlap 50&#xff1a;它可能把制度条款切碎&#xff0c;让召回片段从 0.83 掉到 0.41。这一课承接上一课"Embedding 怎么评估"&#xff0c;给出 Chunk 切分的真正判断框架。 先把术语翻成人话 chunk&#xff1a;切出来的一小段资料 chunk si…

作者头像 李华
网站建设 2026/5/14 5:12:07

Python生成器与迭代器深度解析

Python生成器与迭代器深度解析一、迭代器协议迭代器是实现了__iter__()和__next__()方法的对象。1.1 自定义迭代器class Counter: def __init__(self, start, end): self.current start self.end enddef __iter__(self): return selfdef __next__(self): if self.current >…

作者头像 李华