县疾病预防控制中心突发重大传染病疫情应急处置预案
第六章 数组 指针与字符串
本章主要内容
数组
指针
动态存储分配
指针与数组
指针与函数
字符串
数组的概念
数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。
数组属于构造类型。
数 组
一维数组的声明与引用
一维数组的声明
类型说明符 数组名[ 常量表达式 ];
例如: int a[10];
表示 a 为整型数组,有10个元素:a[0]...a[9]
引用
必须...
第六章 数组 指针与字符串
本章主要内容
数组
指针
动态存储分配
指针与数组
指针与函数
字符串
数组的概念
数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。
数组属于构造类型。
数 组
一维数组的声明与引用
一维数组的声明
类型说明符 数组名[ 常量表达式 ];
例如: int a[10];
表示 a 为整型数组,有10个元素:a[0]...a[9]
引用
必须先声明,后使用。
只能逐个引用数组元素,而不能一次引用整个数组
例如:a[0]=a[5]+a[7]-a[2*3]
数 组
对象数组
声明:
类名 数组名[元素个数];
访问方法:
通过下标访问
数组名[下标].成员名
数 组
对象数组初始化
数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象。
通过初始化列表赋值。
例:
Point A[2]={Point(1,2),Point(3,4)};
如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化(调用默认构造函数)。
数 组
数组元素所属类的构造函数
不声明构造函数,则采用默认构造函数。
各元素对象的初值要求为相同的值时,可以声明具有默认形参值的构造函数。
各元素对象的初值要求为不同的值时,需要声明带形参的构造函数。
当数组中每一个对象被删除时,
系统都要调用一次析构函数。
例6-3 对象数组应用举例
//Point.h
#if !defined(_POINT_H)
#define _POINT_H
class Point
{ public:
Point();
Point(int xx,int yy);
~Point();
void Move(int x,int y);
int GetX() {return X;}
int GetY() {return Y;}
private:
int X,Y;
};
#endif
//6-2.cpp
#include
using namespace std;
#include "Point.h"
Point::Point()
{ X=Y=0;
cout<<"Default Constructor called."<
#include "Point.h"
using namespace std;
int main()
{
cout<<"Entering main..."<成员名
ptr->getx() 相当于 (*ptr).getx();
指 针
对象指针应用举例
int main()
{
Point A(5,10);
Point *ptr;
ptr=&A;
int x;
x=ptr->GetX();
cout<X=xx;
this->Y=yy;
指 针
指向类的非静态成员的指针
通过指向成员的指针只能访问公有成员
声明指向成员的指针
声明指向公有数据成员的指针
类型说明符 类名::*指针名;
声明指向公有函数成员的指针
类型说明符 (类名::*指针名)(参数表);
指 针
指向类的非静态成员的指针
指向数据成员的指针
说明指针应该指向哪个成员
指针名=&类名::数据成员名;
通过对象名(或对象指针)与成员指针结合来访问数据成员
对象名.* 类成员指针名
或:
对象指针名—>*类成员指针名
指 针
指向类的非静态成员的指针
指向函数成员的指针
初始化
指针名=类名::函数成员名;
通过对象名(或对象指针)与成员指针结合来访问函数成员
(对象名.* 类成员指针名)(参数表)
或:
(对象指针名—>*类成员指针名)(参数表)
指 针
指向类的非静态成员的指针
例6-13 访问对象的公有成员函数的不同方式
int main() //主函数
{ Point A(4,5); //声明对象A
Point *p1=&A; //声明对象指针并初始化
//声明成员函数指针并初始化
int (Point::*p_GetX)()=Point::GetX;
//(1)使用成员函数指针访问成员函数
cout<<(A.*p_GetX)()<GetX)()<
using namespace std;
class Point //Point类声明
{public: //外部接口
Point(int xx=0, int yy=0) {X=xx;Y=yy;countP++;}//构造函数
Point(Point &p); //拷贝构造函数
int GetX() {return X;}
int GetY() {return Y;}
static int countP; //静态数据成员引用性说明
private: //私有数据成员
int X,Y;
};
Point::Point(Point &p)
{ X=p.X; Y=p.Y; countP++; }
int Point::countP=0; //静态数据成员定义性说明
指 针
int main() //主函数
{ //声明一个int型指针,指向类的静态成员
int *count=&Point::countP;
Point A(4,5); //声明对象A
cout<<"Point A,"<
using namespace std;
class Point
{ public:
Point()
{ X=Y=0; cout<<"Default Constructor called.\n";}
Point(int xx,int yy)
{ X=xx; Y=yy; cout<< "Constructor called.\n"; }
~Point() { cout<<"Destructor called.\n"; }
int GetX() {return X;}
int GetY() {return Y;}
void Move(int x,int y) { X=x; Y=y; }
private:
int X,Y;
};
动态存储分配
int main()
{ cout<<"Step One:"<
using namespace std;
class Point
{ //类的声明同例6-16,略 };
int main()
{ Point *Ptr=new Point[2]; //创建对象数组
Ptr[0].Move(5,10); //通过指针访问数组元素的成员
Ptr[1].Move(15,20); //通过指针访问数组元素的成员
cout<<"Deleting..."<
using namespace std;
class Point
{ //类的声明同例6-16 … };
class ArrayOfPoints
{ public:
ArrayOfPoints(int n)
{ numberOfPoints=n; points=new Point[n]; }
~ArrayOfPoints()
{ cout<<"Deleting..."<>number;
//创建对象数组
ArrayOfPoints points(number);
//通过指针访问数组元素的成员
points.Element(0).Move(5,10);
//通过指针访问数组元素的成员
points.Element(1).Move(15,20);
}
*
运行结果如下:
Please enter the number of points:2
Default Constructor called.
Default Constructor called.
Deleting...
Destructor called.
Destructor called.
*
动态创建多维数组
new 类型名T[下标表达式1][下标表达式2]…;
如果内存申请成功,new运算返回一个指向新分配内存首地址的指针,是一个T类型的数组。
例如:
char (*fp)[3];
fp = new char[2][3];
char (*fp)[3];
fp
fp+1
*
例6-18动态创建多维数组
#include
using namespace std;
int main()
{ float (*cp)[9][8];
int i,j,k;
cp = new float[8][9][8];
for (i=0; i<8; i++)
for (j=0; j<9; j++)
for (k=0; k<9; k++)
*(*(*(cp+i)+j)+k)=i*100+j*10+k;
//通过指针访问数组元素
for (i=0; i<8; i++)
{ for (j=0; j<9; j++)
{ for (k=0; k<8; k++)
//将指针cp作为数组名使用,
//通过数组名和下标访问数组元素
cout< 和
动态存储分配
动态内存释放函数
void free( void *memblock );
参数memblock:指针,指向需释放的 内存。
返回值:无
头文件: 和
动态存储分配
浅拷贝与深拷贝
浅拷贝
实现对象间数据元素的一一对应复制,拷贝和配拷贝对象共享同一个内存空间,当被拷贝对象数据成员发生改变,会影响到拷贝对象的值。
深拷贝
当被复制的对象数据成员是指针类型时,不是复制该指针成员本身,而是将指针所指的对象进行复制。即拷贝和配拷贝对象共享占用不同的内存空间,两者之间互不影响。
浅拷贝与深拷贝
例6-20对象的浅拷贝
#include
using namespace std;
class Point
{ //类的声明同例6-16
//……
};
class ArrayOfPoints
{
//类的声明同例6-18
//……
};
浅拷贝与深拷贝
int main()
{ int number;
cin>>number;
ArrayOfPoints pointsArray1(number); pointsArray1.Element(0).Move(5,10); pointsArray1.Element(1).Move(15,20);
ArrayOfPoints pointsArray2(pointsArray1);
cout<<"Copy of pointsArray1:"<
using namespace std;
class Point
{ //类的声明同例6-16 …… };
class ArrayOfPoints
{ public:
ArrayOfPoints(ArrayOfPoints& pointsArray);
//其它成员同例6-18
};
浅拷贝与深拷贝
ArrayOfPoints ::ArrayOfPoints
(ArrayOfPoints& pointsArray)
{ numberOfPoints
=pointsArray.numberOfPoints;
points=new Point[numberOfPoints];
for (int i=0; i
using namespace std;
void main (void)
{ char city[80];
char state[80];
int i;
for (i = 0; i < 2; i++)
{ cin.getline(city,80,',');
cin.getline(state,80,'\n');
cout << "City: " << city << " Country: "
<< state << endl;
}
}
字符串
运行结果
Beijing,China
City: Beijing Country: China
Shanghai,China
City: Shanghai Country: China
字符串处理函数
strcat(连接),strcpy(复制),
strcmp(比较),strlen(求长度),
strlwr(转换为小写),
strupr(转换为大写)
头文件
字符串
例6.21 string类应用举例
#include
#include
using namespace std ;
void trueFalse(int x)
{
cout << (x? "True": "False") << endl;
}
字符串
int main()
{ string S1="DEF", S2="123";
char CP1[ ]="ABC";
char CP2[ ]="DEF";
cout << "S1 is " << S1 << endl;
cout << "S2 is " << S2 << endl;
cout<<"length of S2:"<
本文档为【县疾病预防控制中心突发重大传染病疫情应急处置预案】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。