《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

相关文章

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数