C++ STL开发温习与总结(二): 2.C++存储技术

简介: C++ STL开发温习与总结(二): 2.C++存储技术

若该文为原创文章,转载请注明原文出处

本文章博客地址:http://blog.csdn.net/qq21497936/article/details/77937996

长期持续带来更多项目与技术分享,咨询请加QQ:21497936、微信:yangsir198808

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中...

其他(编程相关)

上一篇:C++ STL开发温习与总结(一): 1.C++编程技术

下一篇:C++ STL开发温习与总结(三): 3.C++函数技术

 

前言

     使用了多年C++,没有系统的温习总结过,所以准备温习《C++STL程序员开发指南》,本系列篇章将会是温习总结该书本概念和技术。

     本节讨论的C++存储技术保局哦C++存储类型,C++存储修饰符和C++对象的生存期三部分。

1 C++存储类型

     C++存储分类型告诉编译程序如何存储变量,主要有三种类型extern存储类型,static存储类型和register存储类型。

1-1 extern存储类型

     由于C语言允许将分别编译的达程序的各个模块连接在一起,以提高编译速度,协作大项目管理,因此必须将程序需要的所有全局变量通过某称方法告知所有文件。

     解决上述文档的方法:在一个文件中说明所有全局变量,在另一个文件中使用extern再次描述它们。当在函数内部使用一个全局变量,而它又是在同一文件内说明时,可以选用extern,但一般很少这么做,在C++面向对象编程方法当中这种方法几乎已经不使用,而只是在C语言的源代码中经常可以看见这种方法的身影。

1-2 static存储类型

     静态变量无论在函数中或在文件中都是稳定的便娘。静态局部变量可以使编译产生与全局变量相同的永久性存储区,其差异是静态局部变量仅对于说明它的模块内可知。

     将分类型static用于全局变量,会使编译器程序建立起仅在说明该全局变量的文件中可以认知的全局变量

1-3 regsiter存储类型

     regsiter存储类型仅用于int型和char类型变量(而ANSIC标准拓展了regsiter的定义范围,使其可用于修饰各种类型比纳凉)。通常,regsiter要求编译程序将它所说明的变量值保存在CPU的寄存器中,这样其运算就大大快于普通变量的运算。

     类似数组那样的大结构对象显然不能放在寄存器中,但编译程序将优化处理他们。

     register仅可用于局部变量和函数的形式参数,因为这些变量都是缺省的自动变量。由于register变量可以提高速度,因此它是最理想的循环控制变量。但在实际应用中,由于在同一时刻获取优化速度的register变量有限(一个函数中所允许的寄存器变量的数目取决于处理器类型以及所指定的C语言的编译程序),所以,应该将其用到最能发挥作用的地方,如多次引用同一变量的场合。

2 C++存储修饰符

     用于控制对变量的存取或修改方法的修饰符有:const(常数型)、volatile(暂态型)。

2-1 const-常数型

     const型变量在程序执行期间是不可以改变的(const变量可以赋初值)编译程序可以随意将这些变量放到只读存储器(Rom)中。

     const变量的用途:可以阻止参数被函数修改,即当一个指针传送给一个函数后,函数肯呢个修改该指针所指向的变量,如果指针在参数说明段用const修饰,函数就无法修改指针所指的内容了。

     通常,当一个标准库函数不避修改调用参数指引的对象时,参数则用const来描述。const型变量可以被用户的程序之外的东西修改,例如硬件设备可以给const变量赋值。

2-2 volatile-暂态型

     修饰符volatile通知编译程序:变量值可能由程序中没有显示说明的方式所改变。例如:全局变量的地址可能被传递到操作系统的时钟子程序,用来保存系统实时时间。

     引用volatile的原因:大多数C编译程序都假定表达式内部的内存不变,并以这一假定来自动优化某些表达式。有些编译程序在编译过程中还改变表达式的计算顺序,volatile可以防止这些改变的发生。

     const和volatile可以一起使用,例如:如果假定0x30是仅由外部条件改变的端口值,那么下面说明即可以消除用户希望防止的所有偶尔副作用。

const volatileunsigned char * port = 0x30;

3 C++对象的生存期

     不同的对象生存期不同。按生存期的对象可分为如下三种:

- 局部变量:当对象被定义时调用构造函数,该对象被创建,当程序退出定义该对象所在的函数或程序块时,调用析构函数,释放该对象。

- 静态对象:当程序第一次执行所定义的静态对象时,该对象被创建,当程序结束时,该对象被释放。

- 全局对象:当程序开始时,调用构造函数创建该对象,当程序结束时调用析构函数释放该对象。

3-1 类的作用域

     类域,它是指在类的定义中由一对花括号所括起来的部分。每一个类都具有该类的类域,该类的成员局部在该类所述的类域中。

     在类的定义中可知,类域中可以定义变量,也可以定义函数。从这一点上看类域与文件域很相似。但是,类型又不同于文件域,在类域中定义的变量不能使用auto、register、extern等修饰符,只能用static修饰符,而定义的函数也不能 extern等修饰符。另外,在类域中的静态成员和成员函数还具有外部的连接属性。

     类域小于文件域。

3-2 局部类和嵌套类

     在一个函数提内定义的类成为局部类。局部类中只能使用它的外围作用域中的对象和函数进行联系,因为外围作用域的中的变量与该局部类的对象无关。在定义局部类时需要注意:局部类中不能说明静态成员函数,并且所有成员函数都必须定义在类体内。在实践中,局部类是很少使用的。

int a;
void fun();
{
       staticint a;
       classA { public: void init(int i) {a = i;}
};
A m;
m.init(10);

     在一个类中定义的类成为嵌套类,定义嵌套类的类型为外围类。定义嵌套类的目的在于隐藏类名,减少全局的标识符,从而显示用户能否使用该类简历对象。这样可以提高类的抽象能力,并且强调两个类(外围类和嵌套类)之间的主从关系。

class A:
{
public:
       classB{public: … private: …};
       voidf();
private:
       int a;
}

     其中,类B是一个嵌套类,类A是外围类,类B定义在类A的类体内。以下对嵌套类的若干说明:

- 从作用域的角度看,嵌套类被隐藏在外围类之中,该类名只能在外围类中使用。如果在外围类的作用域内使用该类名时,则需要加名字限定。

- 从访问权限的角度看,嵌套类名与它的外围类的对象成员名具有相同的访问权限规则。不能访问嵌套类的私有成员函数,也不能对外围类的私有部分中的嵌套类建立对象。

- 嵌套类中的成员函数可以在它的类体外定义。

- 嵌套类中说明的成员不是外围类中对象的成员,反之亦然。嵌套类的成员函数对外围类的成员没有访问权限,反之依然,在分析嵌套类与外围类的成员访问关系时,往往把嵌套类看作非嵌套类来处理。这样,上述的嵌套类可写成如下格式:

class A {public : void f(); private: int a;};
class B {public : … private: …}

由此可见,嵌套类仅仅是语法上的嵌入。

- 在嵌套类中说明的友元对外围类的成员没有访问权。

- 如果嵌套类比较复杂,可以只在外围类中对嵌套类进行说明,关于嵌套的详细的内容可在外围类意外的文件域中进行定义。

 

上一篇:C++ STL开发温习与总结(一): 1.C++编程技术

下一篇:C++ STL开发温习与总结(三): 3.C++函数技术

 

若该文为原创文章,转载请注明原文出处

本文章博客地址:http://blog.csdn.net/qq21497936/article/details/77937996


相关文章
|
6月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
167 2
|
6月前
|
存储 算法 C++
【c++丨STL】map/multimap的使用
本文详细介绍了STL关联式容器中的`map`和`multimap`的使用方法。`map`基于红黑树实现,内部元素按键自动升序排列,存储键值对,支持通过键访问或修改值;而`multimap`允许存在重复键。文章从构造函数、迭代器、容量接口、元素访问接口、增删操作到其他操作接口全面解析了`map`的功能,并通过实例演示了如何用`map`统计字符串数组中各元素的出现次数。最后对比了`map`与`set`的区别,强调了`map`在处理键值关系时的优势。
318 73
|
7月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
6月前
|
存储 算法 C++
【c++丨STL】set/multiset的使用
本文深入解析了STL中的`set`和`multiset`容器,二者均为关联式容器,底层基于红黑树实现。`set`支持唯一性元素存储并自动排序,适用于高效查找场景;`multiset`允许重复元素。两者均具备O(logN)的插入、删除与查找复杂度。文章详细介绍了构造函数、迭代器、容量接口、增删操作(如`insert`、`erase`)、查找统计(如`find`、`count`)及`multiset`特有的区间操作(如`lower_bound`、`upper_bound`、`equal_range`)。最后预告了`map`容器的学习,其作为键值对存储的关联式容器,同样基于红黑树,具有高效操作特性。
256 3
|
7月前
|
存储 算法 C++
【c++丨STL】priority_queue(优先级队列)的使用与模拟实现
本文介绍了STL中的容器适配器`priority_queue`(优先级队列)。`priority_queue`根据严格的弱排序标准设计,确保其第一个元素始终是最大元素。它底层使用堆结构实现,支持大堆和小堆,默认为大堆。常用操作包括构造函数、`empty`、`size`、`top`、`push`、`pop`和`swap`等。我们还模拟实现了`priority_queue`,通过仿函数控制堆的类型,并调用封装容器的接口实现功能。最后,感谢大家的支持与关注。
318 1
|
8月前
|
C++ 容器
【c++丨STL】stack和queue的使用及模拟实现
本文介绍了STL中的两个重要容器适配器:栈(stack)和队列(queue)。容器适配器是在已有容器基础上添加新特性或功能的结构,如栈基于顺序表或链表限制操作实现。文章详细讲解了stack和queue的主要成员函数(empty、size、top/front/back、push/pop、swap),并提供了使用示例和模拟实现代码。通过这些内容,读者可以更好地理解这两种数据结构的工作原理及其实现方法。最后,作者鼓励读者点赞支持。 总结:本文深入浅出地讲解了STL中stack和queue的使用方法及其模拟实现,帮助读者掌握这两种容器适配器的特性和应用场景。
175 21
|
7月前
|
存储 算法 C++
深入浅出 C++ STL:解锁高效编程的秘密武器
C++ 标准模板库(STL)是现代 C++ 的核心部分之一,为开发者提供了丰富的预定义数据结构和算法,极大地提升了编程效率和代码的可读性。理解和掌握 STL 对于 C++ 开发者来说至关重要。以下是对 STL 的详细介绍,涵盖其基础知识、发展历史、核心组件、重要性和学习方法。
|
7月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
3月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
83 0
|
3月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
164 0