《C++笔记 第一部分 C++语言篇》第3章 内存模型及名字空间

2024-08-30 13:08

本文主要是介绍《C++笔记 第一部分 C++语言篇》第3章 内存模型及名字空间,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

3.1作用域

 作用域(scope)描述了一个名字在文件(编译单元)的多大范围内可见。

 C++支持三种形式的域:

  •  局部域(local scope)
    局部域是包含在函数定义或者函数块中的程序文本部分。
  •  名字空间域(namespace scope)
    名字空间域是不包含在函数声明函数定义或者类定义内的程序文本部分
    程序的最外层的名字空间域被称作全局域(global scope),或全局名字空间域(global namespace scope)
    对象函数类型以及模板都可以在全局域中定义
    可以利用名字空间定义namespace definition 来定义用户声明的user-declared 的名字空间。每个用户声明的名字空间都是一个不同的域,它们都与全局域不同,与全局域相同的是用户声明的名字空间可以包含对象函数类型和模板的声明与定义,以及被嵌套其内的用户声明的名字空间。
  •  类域(class scope)
    每个类定义都引入了一个独立的类域

 变量的作用域

  •  局部变量的作用域为局部,仅能在代码块内可见
  •  "{}"就是代码块的作用域,函数、switch、for、while,等等
  •  全局变量的作用域为全局的,在定义处开始直到文件尾可见
  •  自动变量的作用域是局部的,静态变量的作用域要看其定义位置
  •  函数原型作用域
    在函数原型声明时候,在"()“内声明的参数列表中的变量,仅能在”()"内可见。正因为如此,所以函数声明时,有无形参,形参是什么都不重要。
  •  名字空间作用域
    在指定名字空间中定义的变量,在整个名字空间中可见。
  •  类作用域
    类中声明的变量,在整个类内部可见,不管是什么权限的变量。

 函数的作用域
可以是整个类,也可以是整个名字空间,但不能是局部的。

3.2链接性及存储性

链接性(linkage)描述了名称如何在各个单元中的共享。
外部链接:是指名称可以在文件间共享
内部链接:名称仅仅能在一个文件中的函数共享
变量的链接性及存储性(下表):

表1

在这里插入图片描述
 变量的说明限定符
auto(C++11中没有)、register、static、extern、thread_local(C++11新增)、mutable、const、volatile

 函数的链接性及存储性
函数的存储持续性为静态的
默认的情况下,函数的链接性为外部的
要引用函数,可以加extern说明限定符
加static说明限定符的函数,链接性为内部的;如果和外部的函数重名,则静态的函数替换之。
非内联函数受单定义规则限制,但是内联函数则不然。C++运行内联函数的定义放在头文件内。不过一个内联函数所有的定义必须相同。

 语言链接性
对于函数或变量而言,只要有链接性,则每种编程语言,都有自己的规则来处理它们的名字。这个就是语言的链接性。
如果C语言编写的函数需要被C++代码使用到,就要注意到语言的链接性。

extern "C" void spiff(int);//use C protocol for name look-up
extern void spoff(int);//use C++ protocol for name look-up
extern "C++"void spaff(int);//use C++ protocol for name look-up

3.3动态内存

变量的5种存储方案(线程内存除外)中仅仅描述了自动存储和静态存储,并没有说明动态存储的情况。C中malloc/free分配管理的堆区就是动态内存,C++中则引入了运算符new/delete来分配内存。

运算符new可以动态创建对象,创建对象后会返回对象的地址。如果内存不足导致车无法成功创建对象,则归返回一个空指针。
动态创建的对象要用“delete对象指针”才能销毁对象;
运算符符new和new[]调用的函数如下:

void *operator new (std :: size_t);//used by new
void *operator new[] (std :: size_t);//used by new[]

运算符符delete和delete[]调用的函数如下:

void operator delete(void *);
void operator delete[] (void *);

定位new运算符:

int *p2 = new(buffer) int;
invokes new(sizeof(int),buffer );

例子:用Box类创建对象

Box *pt1;
pt1 = new Box;//创建对象
delete pt1;//销毁对象
Box *pt1= new Box(32);//创建对象
Box *pt;
pt = new Box;//创建对象
if(pt != NULL)
{delete pt;pt = NULL; 
}

3.4声明区与作用域

 C++标准的名字空间属性
声明区:可以进行声明的区域
潜在的作用域:变量潜在的作用域,从声明点,到声明区结尾

 变量并非在潜在的作用域内都可见,只要存在嵌套声明区,且和内部声明区的变量重名,则会被内部声明区的变量隐藏

 每个声明区都可以声明名称,且相互独立。也就意味着,即使不同声明区的出现了同名,也不会发送冲突。

在这里插入图片描述

3.5引用

引用是变量的别名,,不会再开辟空间。引用在实计开发中,只使用于函数的形式参数。比喻:引用是一种受限指针。引用能做的事指针都能做,而指针能做事引用不一定能用。引用的底层实现多数编译器也是指针.

#include <iostream>
using namespace std;void f1() {int a = 20;int &b = a;//创建引用类型变量时,要立刻 "赋值"int c = 100;b = c;cout<<b<<endl;//100cout<<a<<endl;//100cout<<&a<<endl;// 0x7fffcaa6ca10cout<<&b<<endl;// 0x7fffcaa6ca10
}void f2(int *p) {*p = 21;
}void f3(int &r) {//int &r = ager = 22; //age=22
}int main() {
f1();int age = 20;//调用函数,让age的值改变为21f2(&age);cout<<"age="<<age<<endl;//age=21//调用函数,让age的值改变为22; 但是不能使用指针f3(age);cout<<"age="<<age<<endl;//age=22return 0;
}

结果如下所示:

在这里插入图片描述

3.6名字空间

 命名声明区
namespace 名称{
//声明区
}

 使用名称空间

 声明的话,则直接使用
using 名称::变量
using 名称::函数名

 不声明的话
名称::变量或函数名

参考代码

fs.cpp文件

#include "fs.h"namespace fs1
{namespace one204{void test(){}}void show1() {}void show() {}void Stu::study(){}}namespace fs2
{void show2(){}void show(){}void Stu::sleep(){}
}

fs.h文件

#ifndef FS_H_
#define FS_H_namespace fs1
{namespace one204{void test();}void show1();void show();class Stu{public:void study();};
}namespace fs2
{void show2();void show();class Stu{public:void sleep();};
}
#endif /* FS_H_ */

main.cpp文件

/********************************************************************************* @file    		main.cpp* @author  		BruceOu* @version 		V1.0* @date    		2019.03.03* @brief          命名空间*******************************************************************************/
/**Includes*********************************************************************/
#include <iostream>
#include "fs.h"/**namespace********************************************************************/
//using namespace std;
using namespace fs1::one204;
using namespace fs1;
using namespace fs2;/*** @brief     主函数* @param     argcargv* @retval    None*/
int main(int argc, char *argv[])
{std::cout<<"fsdfsd"<<std::endl;fs1::one204::test();fs1::one204::test();fs1::show1();fs1::show();fs2::show();fs1::Stu stu;stu.study();fs2::Stu stu2;stu2.sleep();show2();return 0;
}

这篇关于《C++笔记 第一部分 C++语言篇》第3章 内存模型及名字空间的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1120910

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl