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

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

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

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

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

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

其他(编程相关)

上一篇:没有了

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

 

前言

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

 

1概论

l  C++语言是基于C语言的语法基础上融入了其他语言中许多独特的语法特定之后而形成的全新的语言体系。

l  C++与C语法结构几乎一致且多数编译器可单独编译和混编(商业需求),很大程度上使读者误以为C++语言是C语言的改进型语言。

l  C++语言,类(Class)是核心。

l  本篇章主要介绍C++的关键语法,分析C++的许多内核技术。

 

2 C++与C语言的区别

     C语言提供:宏、指针、结构、数组和函数;

     C++语言提供:宏、指针、结构、数组和函数,此外还有私有和保护性成员、函数重载、缺省参数、构造和析构函数、自定义操作符、内联函数、引用、友元、模版、异常、命令空间等。

     C是C++的子集,但是C是面向过程,C++是面向对象。

2-1文件扩展名的改变

     C语言体系使用“.c”;

     C++语言体系使用“.cpp”(即CPlus-Plus);

     C和C++头文件一般仍用“.h”,有些操作系统规定使用“hpp”。

2-2简化输入/输出手段

C语言,输入/输出本是依靠函数来实现(如scanf、printf等),头文件声明“#include<stdio.h”;

C++语言另外定保留字和运算符来替代C语言中对标准输入/输出函数的引用,头文件声明 “#include<iostream.h>”(标准IO流),C++语言的保留字为:

cout<<”输出内容”<<…; /* 为标准输出算符(默认为显示器)*/
cout>>”输入内容”>>…; /* 为标准输入算符(默认为键盘) */

2-3数据类型声明的改变

     C++语言新增了类(Class)类型,继承了C语言所支持的所有数据类型。但C++在数据类型的声明上作了两种较大的改变:

l  允许数据类型的声明语言可以出现在程序的任何位置;

l  允许直接使用结构体名定义实体。

structDt {  unsigned int mm, dd, yy; };
Dtdt[3];

2-4动态内存分配运算符的使用

     C++与C语言相比,允许进行动态内存分配,使用new和delete,这是一对真正的运算符,无须任何函数支持(即由C++语言编译器直接处理)。

     new运算符的功能等效于C语言中的malloc一类的函数功能。

     指向对应类型的指针 = new 类型描述符;      

int*p; 
p =new int;  // 仅占用一个机器字长空间
int*p2;
p2 =new int(20);  // 仅占用一个机器字长且赋初值
int*p3; 
p3 =new int[20];  // 占20个机器字长单元

(机器字长:机器字长是指计算机进行一次整数运算所能处理的二进制数据的位数(整数运算即定点运算)。

     delete 指针名;

如果指针是数组,可以加上“[ ]”表示,即

     delete [n]指针名;

/* 为标准输出算符(默认为显示器)*/

     cout>>”输入内容”>>…; /* 为标准输入算

l  执行new运算符的操作通常按堆栈的存取方式由后向前安排。

l  释放new出的变量a和b后,当重新分配a[n]时(n>1),由于前一个a指向一个字长的空间,第二次要求n个单元的分配,只得另辟空间,此种分配便会造成至少一个字长的内存空洞浪费,这种空洞浪费被称为内存碎片的一种形态,是C++语言程序在运行时容易造成的一种不良现象。

2-5引用(References)类型

     这是C++语言的一个特殊的数据类型描述,用于在程序的不同部分使用两个以上的变量名指向同一地址,使得其对任一个变量的操作实际上都是对同一个地址单元进行的。在这种两个以上变量名的关系中,被声明为引用类型的变量名被称之为实变量名的别名。语法如下:

     类型名 & 引用型函数名或变量名 = 前已声明的(常)变量名;

       int i =0;
       int &j = i;
       j = 1;

2-6对const语义的扩展

l 一般常量

     在c语言中,const保留字是作为声明常数数据类型的附加类别标识使用的,被声明的常数必须到程序执行后才能被访问,则在C++语言中,则允许被声明的常数在后续的编译中被直接访问,如下面:

      const inti = 9;

      char t[i];  // 等效于 char[9];  但是此句在c语言编译时报错。

     <类型说明符> const <数组名>[<大小>] … 或者

     const<类型说明符> <数组名>[<大小>] …

     <类名> const <对象名> 或者

     const <类名> <对象名>

l 指针和常引用

使用const修饰指针时,由于const的位置不同而含义不同。

       char *const ptr1 = sringptr1;  // 指向字符变量的常指针
       charconst * ptr2 = “xxx”;  // 指向常量的指针

l 常成员函数

使用const关键字进行说明的成员函数,成为常成员函数。只有常成员函数才有资格操作常量或者常对象,没有使用const关键字说明的成员函数不能用来操作常对象。常成员函数说名格式如下:

<类型说明符> <函数名>(<参数表>) const;

      如R类中有voidprint()和void print()const;

 

       R a;
       const Rb;
       a.print();  // 调用 void print()
       b.print();  // 调用 void print() const

 

l 常数据成员

     类型修饰符const不仅可以说明成员函数,也可以说明数据成员。由于const类型对象必须被初始化,并且不能更新,因此,在类中说明了const数据成员时,只能通过成员初始化列表的方式来生成构造函数对数据成员初始化。

.h文件中:

class A { …
       A(inti);
       constint &r;
       constint a;
       staticconst int b;
…}

.cpp文件中:

const int A::b=10;
A::A(int i):a(i),r(a) {  }

2-7指针声明类型与对象类型相一致

     在C语言中,指针声明时的类型与其所指向的数据实体的类型可以不一致(借助C语言内定的缺省类型转换技术);

     在C++语言中,指针声明时的类型与其所指向的数据实体的类型必须一致。

       void*f;  // 空指针
       inti=1,*p;
       f =&i;
       p=(int*)f;  // C++语言不能通过缺省将非int类型的地址赋值p,只能(int*)强制转换
       f=p;
       cout<< “p is “ << p << *p;
       count<< “f is “ << f << *f;  // void的值不能显示,故编译报错。

2-8 int与char不再等价

     在C语言中,char类型(’A’)同int类型同样占用2B的空间(假设机器字长为16位),所以有时认为两者可以等价。

     在C++语言中,’A’类型的长度计量真正成为按单字节为单位计算了。

     所以在使用时,sizeof(‘A’)的值为1,而sizeof(65)的值为2,两者不一致。

注意:在实际和其他教程中,c语言中的char类型一直是1B。2-8这点存在疑问。

2-9 结构数据类型的变化

     在C语言中,struct声明一般是同对其操作的程序代码相分离的。

     在C++语言中,允许对结构体的数据成员进行操作的函数也作为其成员在struct内矛以声明。C++举例代码片段:

#include <iostream.h>
struct Dt
{
       unsignedint yy,mm,dd;
       voiddsp() {cout<<yy<<’.’<<mm<<’.’<<dd<<endl;}
}
void main()
{
       Dt d;
       d.yy=2002;
       d.mm=8;
       d.dd=1;
       d.dsp();
}

     C++语言的struct正式后面要讲的class声明的一个特例,类的概念也由此引出。要强调的另一点是在C++语言中含有成员函数原形声明的struct必须作为全局结构安排。因为C++不支持局部函数嵌套的声明结构。

2-10数据和指针技术的不同

     在C中,一个数组只是一篇存储区域。例如:

       intv[10];  // 10个int型变量的数组
       v[3] =1;  // 将1赋值给v[3]
       int x= v[3];  // 从v[3]读取元素值

     在C中,一个指针是指一个变量,它存放着某个存储位置的地址。例如:

       int*p;  // p是一个指向int型对象的指针
       p =&v[7];  // 将v[7]的地址赋值给p
       *p =4;  // 通过p来向v[7]写入数据
       int y= *p;  // 通过p来读取v[7]的数据

     指针的标记*用在声明中,表示声明的对象是指针;用在表达式中,表示取指针所指向的那个元素。

     C++引借了C的这种颇为简单的、与机器结构极为近似的存储方案,同时也引借了C在表达式、控制结构以及函数等方面所使用的方案。

       int*find(int v[], int vsize, int val)  //在v中查找val
       {
              for(intI = 0; I < vsize; i++)  // 从0到vsize-1的循环
                     if(v[i] == val) return &v[i];  // 如果找到val,就返回指向元素的指针
              return&v[vsize];  // 如果没找到,就返回v末端元素的指针
       }

     对于诸如find()这样的函数,C++标准程序库提供了更为通用的函数版本。

 

上一篇:没有了

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

 

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

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


相关文章
|
3天前
|
IDE 开发工具 C语言
C++一分钟之-嵌入式编程与裸机开发
通过这些内容的详细介绍和实例解析,希望能帮助您深入理解C++在嵌入式编程与裸机开发中的应用,提高开发效率和代码质量。
27 13
|
7天前
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
15 1
|
20天前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
34 7
|
2月前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
66 4
|
2月前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
81 5
|
2月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
63 2
|
2月前
|
存储 算法 Linux
【c++】STL简介
本文介绍了C++标准模板库(STL)的基本概念、组成部分及学习方法,强调了STL在提高编程效率和代码复用性方面的重要性。文章详细解析了STL的六大组件:容器、算法、迭代器、仿函数、配接器和空间配置器,并提出了学习STL的三个层次,旨在帮助读者深入理解和掌握STL。
61 0
|
23天前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
31 0
WK
|
2月前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
66 0
WK
|
2月前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
120 0