OOP_由C到C++ (6)

如果希望在局部变量的作用域内使用同名的全局变量,可以在全局变量加上“::”,此时::avar代表全局变量avar

#include <iostream.h> int avar=10; main() { int avar; avar=25; cout<<"local avar ="<<avar<<endl; cout<<"global avar="<<::avar<<endl; return 0; } 12. 无名联合

无名联合是C++中的一种特殊联合,可以声明一组无标记名共享同一段内存地址的数据项。如:

union{ int i; float f; }

在此无名联合中,声明了变量i和f具有相同的存储地址。无名联合可通过使用其中数据项名字直接存取,例如可以直接使用上面的变量i或f,如:i=20;

13. 强制类型转换

在C中数据类型转换的一般形式:(数据类型标识符)表达式

int i=10; float x=(float) i;

C++支持这样的格式,还提供了一种更为方便的函数调用方法,即将类型名作为函数名使用,使得类型转换的执行看起来好像调用了一个函数。形式为:数据类型标识符 (表达式)

int i=10; float x=float(i);

以上两种方法C++都接受,但推荐使用后一种方式。

14. 动态内存分配

作为对C语言中malloc和free的替换,C++引进了new和delete操作符。它们的功能是实现内存的动态分配和释放

动态分配new的一般形式是:

指针变量=new 数据类型;

指针变量=new 数据类型(初始值);

int *a, *b; a=new int; b=new int(10);

释放由new操作动态分配的内存时,用delete操作。

它的一般形式是:delete 指针变量;

delete a; delete b; 例1.9 操作符new和delete的使用 #include <iostream.h> main() { int *p; // 声明一个整型指针变量p p=new int; // 动态分配一个存放int型数据的内存空间,并将首地址赋给p *p=10; cout<<*p; delete p; // 释放指针变量p指向的内存空间 return 0; } 例1.10 将new和delete用于结构类型 #include<iostream.h> #include<string.h> struct person { char name[20]; int age; }; main() { person *p; p=new person; strcpy(p->name, "Wang Fun"); p->age=23; cout<<"\n"<<p->name<<" "<<endl<<p->age; delete p; return 0; }

与C的内存动态分配和释放操作(malloc和free)相比,C++提供的动态分配有以下优点

(1) new和delete 操作自动计算需要分配和释放类型的长度。这不但省去了用sizeof计算长度的步骤,更主要的是避免
了内存分配和释放时因长度出错带来的严重后果;

(2) new操作自动返回需分配类型的指针, 无需使用强制类型转换

(3) new操作能初始化所分配的类型变量。

(4) new和delete都能可以被重载,允许建立自定义的内存管理法。

对使用new和delete的几点说明:

(1)用new分配的空间,使用结束后应该用delete显示的释放,否则这部分空间将不能回收而变成死空间。

(2)使用new动态分配内存时,如果没有足够的内存满足分配要求, new将返回空指针(NULL)。因此通常要对内存的动态分配是否成功进行检查。

例1.11 对内存的动态分配是否成功进行检查 #include <iostream.h> main() { int * p; p=new int; if(!p){ cout<<"allocation failure\n"; return 1; } *p=20; cout<<*p; delete p; return 0; }

(3) 使用new可以为数组动态分配内存空间这是需要在类型后面缀上数组大小。其语法形式为:
指针变量=new 类型名 [下标表达式];

例如: int *pi=new int[10];
这时new为具有10个元素的整型数组分配了内存空间,并将首地址赋给了指针pi。

使用new为多维数组分配空间时,必须提供所有维的大小,

如: int *pi=new int[2][3][4];

其中第一维的界值可以是任何合法的表达式,如:int i=3; int *pi=new int[ i ][2][3];

(4) 释放动态分配的数组存储区时,可使用delete运算符,其语法形式为: delete [ ]指针变量;

无须指出空间的大小,但老版本的Cpp要求在delete的方括号中标出数字,以告诉Cpp要释放多少个元素所占的空间。例如:delete []pi; delete [10]pi;

(5) new可在为简单变量分配内存空间的同时,进行初始化。这时的语法形式为:指针变量=new 类型名(初始值列表)

例 1.12 new为简单变量分配内存空间的同时,进行初始化 #include <iostream.h> int main() { int *p; p=new int(99); // 动态分配内存,并将99作为初始值赋给它 if (!p) { cout<<"allocation failure\n"; return 1; } cout<<*p; delete p; return 0; } 例 1.13 给数组分配内存空间的例子。 #include <iostream.h> main() { double *s; s=new double[10]; if(!s){ cout<<"alocation failure\n"; return 1; } for(int i=0;i<10;i++) s[i]=100.00+2*i; for(int i=0;i<10;i++) cout<<s[i]<<" "; delete []s; return 0; } 15. 引用 (1) 引用的概念

引用就是某一变量(目标)的一个别名,这样对引用的操作就是对目标的操作。

引用的声明方法: 类型标识符 &引用名=目标变量名;

int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名 说明:

(1) &在此不是求地址运算,而是起标识作用。

(2) 类型标识符是指目标变量的类型。

(3)声明引用时,必须同时对其进行初始化

(4)引用声明完毕后,相当于目标变量名有两个名称

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzsgy.html