若该文为原创文章,转载请注明原文出处
本文章博客地址: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