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


相关文章
|
14天前
|
机器学习/深度学习 算法 算法框架/工具
为什么使用C++进行机器学习开发
C++作为一种高性能语言,在某些性能要求极高或资源受限的场景下也具有非常重要的地位。C++的高效性和对底层硬件的控制能力,使其在大规模机器学习系统中发挥重要作用,尤其是当需要处理大数据或实时响应的系统时。
29 3
|
8天前
|
存储 算法 C++
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
文章详细探讨了C++中的泛型编程与STL技术,重点讲解了如何使用模板来创建通用的函数和类,以及模板在提高代码复用性和灵活性方面的作用。
24 2
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
|
9天前
|
物联网 C# C语言
物联网开发中C、C++和C#哪个更好用
在物联网(IoT)开发中,C、C++和C#各有优缺点,适用场景不同。C语言性能高、资源占用低,适合内存和计算能力有限的嵌入式系统,但开发复杂度高,易出错。C++支持面向对象编程,性能优秀,适用于复杂应用,但学习曲线陡峭,编译时间长。C#易于学习,与.NET框架结合紧密,适合快速开发Windows应用,但性能略低,平台支持有限。选择语言需根据具体项目需求、复杂性和团队技术栈综合考虑。
|
14天前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
54 1
|
2月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
75 2
|
2月前
|
存储 算法 编译器
[C++] STL简介
[C++] STL简介
23 1
|
2月前
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
36 2
|
1月前
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
48 0
|
2月前
|
安全 编译器 容器
C++STL容器和智能指针
C++STL容器和智能指针
|
2月前
|
算法 安全 Linux