C++_对象数组与对象指针
对象数组与对象指针
1. 对象数组
所谓对象数组是指每一数组元素都是对象的数组, 也就是说,若一个类有若干个对象,则把这一系列的对象用一个数组来存放。
对象数组的元素是对象, 不仅具有数据成员,而且还有函数成员
定义一个一维数组的格式如下:
类名 数组名[下标表达式];
exam ob[4]; //定义了类exam的对象数组ob.
与基本数据类型的数组一样,在使用对象数组时也只能访问单个数组元素,也就是一个对象,通过这个对象,也可以访问到它的公有成员
使用的一般形式是:
数组名[下标].成员名
例3.4 对象数组的应用
#include<iostream.h>
class exam{
public:
void set_x(int n){ x=n; }
int get_x(){ return x; }
private:
int x;
};
main()
{
exam ob[4];
int i;
for (i=0;i<4;i++)
ob[i].set_x(i);
for (i=0;i<4;i++)
cout<<ob[i].get_x()<<′ ′;
cout<<endl;
return 0;
}
0 1 2 3
如果需要建立某个类的对象数组,在设计类的构造函数时就要充分考虑到数组元素初始化的需要;
- 当各个元素的初值要求为相同的值时,应该在类中定义出不带参数的构造函数或带缺省参数值的构造函数;
- 当各元素对象的初值要求为不同的值时需要定义带形参(无缺省值)的构造函数。
- 定义对象数组时,可通过初始化表进行赋值。定义对象数组时,可通过初始化表进行赋值
【例3.5】 通过初始化表给对象数组赋值
#include<iostream.h>
class exam{
public:
exam()
{ x=123;}
exam(int n)
{ x=n;}
int get_x()
{ return x; }
private:
int x;
};
main()
{
exam ob1[4]={11,22,33,44};
exam ob2[4]={55,66};
exam ob3[4]={exam(11),exam(22),exam(33),exam(44)};
exam ob4[4]={exam(55),exam(66)};
ob4[2]=exam(77);
ob4[3]=exam(88);
int i;
for (i=0;i<4;i++)
cout<<ob1[i].get_x()<<' ';
cout<<endl;
for (i=0;i<4;i++)
cout<<ob2[i].get_x()<<' ';
cout<<endl;
for (i=0;i<4;i++)
cout<<ob3[i].get_x()<<' ';
cout<<endl;
for (i=0;i<4;i++)
cout<<ob4[i].get_x()<<' ';
cout<<endl;
return 0;
}
11 22 33 44
55 66 123 123
11 22 33 44
55 66 77 88
【例3.6】 本例说明当构造函数具有一个以上的参数时,如何对二维数组对象进行初始化
#include <iostream.h>
class example{
public:
example(int n, int m)
{
x = n;
y = m;
}
~example()
{ cout<<"Destructor called.\n"; }
int get_x()
{ return x;}
int get_y()
{ return y;}
private:
int x, y;
};
main()
{
example op[3][2]={
example(1,2),example(3,4),
example(5,6),example(7,8),
example(9,10),example(11,12) };
int i;
for (i=0;i<3;i++)
{
cout<<op[i][0].get_x()<<' ';
cout<<op[i][0].get_y()<<"\n";
cout<<op[i][1].get_x()<<' ';
cout<<op[i][1].get_y()<<"\n";
}
cout<<"\n";
return 0;
}
1 2
3 4
5 6
7 8
9 10
11 l2
Destructor called.
Destructor called.
Destructor called.
Destructor called.
Destructor called.
Destructor called.
2. 对象指针
每一个对象在初始化后都会在内存中占有一定的空间。因此,即可以通过对象名访问一个对象,也可以通过对象地址来访问一个对象。
对象指针就是用于存放对象地址的变量。声明对象指针的一般语法形式为:类名* 对象指针名;
(1)用指针访问单个对象成员
- 定义指针变量:
Date *p,date1;
- 初始化:指向一个已创建的对象
p=&date1;
- 访问:用“->”操作符,只能访问该对象的公有成员。
p->setdate(2007,10,18);
例3.7 对象指针的使用
#include<iostream.h>
class exe{
public:
void set_a(int a){ x=a; }
void show_a(){ cout<<x<<endl; }
private:
int x;
};
main()
{
exe ob,*p; // 声明类exe的对象ob和类exe的对象指针p
ob.set_a(2);
ob.show_a(); // 利用对象名访问对象的成员
p=&ob; // 将对象ob的地址赋给对象指针p
p->show_a(); // 利用对象指针访问对象的成员
return 0;
}
2
2
(2)用对象指针访问对象数组
对象指针不仅能访问单个对象,也能访问对象数组.
exe *p; //声明对象指针p
exe ob[2]; //声明对象数组ob[2]
p=ob; //将对象数组的首地址赋给对象指针
main()
{
exe ob[2],*p;
ob[0].set_a(10);
ob[1].set_a(20);
p=ob;
p->show_a();
p++;
p->show_a();
return 0;
}
结果:
10 20
一般而言,当指针加1或减1时,它总是指向其基本类型中相邻的一个元素,对象指针也是如此. 本例中指针对象p加1时,指向下一个数组对象元素.
【例3.8】 本例说明如何通过对象指针来访问对象数组,使程序以相反的顺序显示对象数组的内容
#include <iostream.h>
class example{
public:
example(int n, int m)
{
x=n;
y=m;
}
int get_x()
{ return x;}
int get_y()
{ return y;}
private:
int x,y;
};
main()
{
example op[4]={
example(1,2),
example(3,4),
example(5,6),
example(7,8)
};
int i;
example *p;
p=&op[3]; // 取出最后一个数组元素的地址
for (i=0;i<4;i++)
{
cout<<p->get_x()<<‘ ‘;
cout<<p->get_y()<<"\n";
p--; // 指向前一个数组元素
}
cout<<"\n";
return 0;
}
7 8
5 6
3 4
1 2
指向类的成员的指针
类的成员自身也是一些变量、函数或者对象等。因此,也可以直接将它们的地址存放到一个指针变量中,这样就可以使指针直接指向对象的成员,进而可以通过指针访问对象的成员。
可在类外定义指向类的成员的指针来控制对象的成员。
注意:
- 指向成员的指针只能访问公有数据成员和成员函数。
- 使用要先声明,再赋值,然后访问。
(1)指向数据成员的指针
- 声明: 类型说明符 类名:: *数据成员指针名
- 赋值: 数据成员指针名=&类名:: 数据成员名
- 使用
- 对象名. *数据成员指针名
- 对象指针名->*数据成员指针名
【例3.9】 访问对象的公有数据成员的几种方式
#include<iostream.h>
class A{
public:
A(int i) { z=i; }
int z;
};
void main()
{
A ob(5);
A *pc1; // 声明一个对象指针pc1
pc1=&ob; // 给对象指针pc1赋值
int A∷*pc2; // 声明一个数据成员指针pc2 // ①
pc2=&A∷z; // 给数据成员指针pc2赋值 // ②
cout<<ob.*pc2<<endl; // 用成员指针pc2访问数据成员z
cout<<pc1->*pc2<<endl; // 用成员指针pc2访问数据成员z
cout<<ob.z<<endl; // 使用对象名访问数据成员z
}
(2)指向成员函数的指针
- 声明: 类型说明符 (类名∷ *指针名)(参数表);
- 赋值: 成员函数指针名 = 类名∷成员函数名;
- 使用
- (对象名.*成员函数指针名)(参数表);
- (对象指针名 -> *成员函数指针名) (参数表);
【例3.10】 访问对象的公有成员函数的几种方式
#include<iostream.h>
class Coord {
public:
Coord(int a=0,int b=0) { x=a; y=b; }
int getx() { return x; }
int gety() { return y; }
private:
int x,y;
};
void main()
{
Coord op(5,6);
Coord *pc1=&op;
int (Coord∷*pc_getx)();
pc_getx=Coord∷getx;
cout<<pc1->getx()<<endl;
cout<<op.getx()<<endl;
cout<<(op.*pc_getx)()<<endl;
cout<<(pc1->*pc_getx)()<<endl;
}
C++_对象数组与对象指针的更多相关文章
- C++二维数组、指针、对象数组、对象指针
项目中用到,随手记一下: 1.二维数组.与指针 创建二维数组指针的方式: a.已知一维的大小 1 int **array=new int *[rows]; 2 (for int i=0;i<ro ...
- C++对象数组与对象指针
(一)对象数组 将具有相同类类型的对象有序地集合在一起便构成了对象数组,以一维对象数组为例,其定义形式为: 类名 对象数组名[]; Point points[100]; 关于对象数组的几点说明: (1 ...
- JavaSE基础知识(5)—面向对象(对象数组和对象关联)
一.对象数组 1.说明 数组的定义类型为对象类型 2.动态初始化 1.声明并开辟空间 Person[] pers = new Person[长度];2.赋值 for(int i=0;i<pers ...
- vue的v-for循环普通数组、对象数组、对象、数字
如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...
- 对象数组和对象对象数组的for-each循环
对象数组的声明 类名称 对象数组名[] = null: 对象数组名 = new 类名称[长度] 定义并开辟数组 类名称 对象数据名[] = new 类名称[长度]; 在声明一个对象数组后,必须对每个数 ...
- json对象数组按对象属性排序
var array = [ {name: 'a', phone: 1, value: 'val_4'}, {name: 'b', phone: 5, value: 'val_3'}, {name: ' ...
- js 对象数组根据对象中的属性排序
function createComparisonFunction(propertyName){ return function(object1,object2){ var value1 = obje ...
- js实现的对象数组根据对象的键值进行排序代码
有时候会遇到做展示数组的排序,由大到小和由小到大的切换: var arr=[{id:1,webName:"蚂蚁部落"},{id:2,webName:"网易"}] ...
- js中json对象数组按对象属性排序---1
转载:https://www.cnblogs.com/jasonwang2y60/p/6656103.html 在实际工作经常会出现这样一个问题:后台返回一个数组中有i个json数据,需要我们根据js ...
随机推荐
- 【论文阅读】DCAN: Deep Contour-Aware Networks for Accurate Gland Segmentation
DCAN: Deep Contour-Aware Networks for Accurate Gland Segmentation 作者:Hao Chen Xiaojuan Qi Lequan Yu ...
- IIS错误代码500.21 ,Nhibernate更新报错,委托的使用。action传参数
快速阅读 IIS错误代码500.21 ,Nhibernate更新报错,委托的使用.action传参数 IIS错误代码500.21 HTTP 错误 500.21 - Internal Server Er ...
- 面试题 int(3) int(10) 区别
1.MySQL 中 int(3) int(10) 区别 答案 存储大小并无差异,只是不足位数的时候,左边补0. ###补充知识点 创建数据库表时,加zerofill ,可以看出效果.mysql 默认 ...
- AOSP---"Android Open-Source Project"
定义 编辑 "Android Open-Source Project"的缩写 中文意为"Android 开放源代码项目" 内容 编辑 在Android Open ...
- RTSP、RTMP、HTTP协议
一.异同1.RSTP.RTMP.HTTP协议共同点RTSP RTMP HTTP都是用在应用层.理论上这三种协议都可以做直播和点播,但直播一般用RTSP和RTMP点播用HTTP.2.RSTP.RTMP. ...
- 000 装docker
直接参考别人的文章,经过验证,没有问题,需要网络. URL: https://www.cnblogs.com/qgc1995/archive/2018/08/29/9553572.html 我是虚拟机 ...
- OpenCv dnn模块扩展研究(1)--style transfer
一.opencv的示例模型文件 使用Torch模型[OpenCV对各种模型兼容并包,起到胶水作用], 下载地址: fast_neural_style_eccv16_starry_night.t7 ...
- linux下phpmailer发送邮件出现SMTP ERROR: Failed to connect to server: (0)错误
转自:https://www.cnblogs.com/raincowl/p/8875647.html //Create a new PHPMailer instance $mail = new PHP ...
- 实现不同的项目,用不同的git 账号提交
可以全局配置一个git 账户名和密码,然后在具体项目里单独配置一个账户名和密码 例如: git config --global user.name "winyh" git conf ...
- array_fill 填充数组内容
<?php $a = array_fill(, , 'banana'); $b = array_fill(-, , 'pear'); print_r($a); print_r($b) Array ...