第八讲:对象数组与指针

【C语言学习总结】——第八指针 第八指针 指针变量定义 指针变量永远占2个字节 定义的格式:类型名 *指针变量名; (此种格式定义的为列指针或者叫元素指针或者叫普通指针) 注意: 1.定义变量(普通变量、指针变量)都必须在前面有类型名 2. 在定义指针变量时,指针变量名前的“*”表示现定义的是一个指针类型的变量。星号并不是指针变量名的一部分,只有一个标志 3. 指针变量专门用来存地址,禁止将一个整型值直接赋给一个指针变量 指针变量的引用 1. “&”取地址运算符,通过&运算符可以取出普通变量的地址 2. “*” 指针运算符, 阅读详情

第八讲:对象数组与指针

本讲基本要求

    * 掌握:对象数组和对象指针的定义及引用。
    * 理解:this指针的使用;对象数组的定义、使用方法;指向对象成员的指针。
    * 了解:构造函数有多个参数对象数组和构造函数有单个参数对象数组的实参的传递方式。
重点、难点
    * 对象数组和对象指针的定义及引用。

一、对象数组

   数组不仅可以由简单变量组成(例如整型数组的每一个元素都是整型变量),也可以由对象组成(对象数组的每一个元素都是同类的对象)。

      定义对象数组的一般格式类名 数组名[数组个数]

说明:
   
1、有许多实体的属性是共同的,只是属性的具体内容不同时我们可对立对象数组。
   2、定义数组,有多少个元素在建立数组时,同样要调用多少次构造函数。如果有50个元素,需要凋用50次构造函数。
   3、如果构造函数只有一个参数,在定义数组时可以直接在等号后面的花括号内提供实参。
Student stud[3]={60,70,78};
//合法.3个实参分别传递给3个数组元素的构造函数。
   
4、构造函数有多个参数,则不能用在定义数组时直接提供所有实参的方法,因为一个数组有多个元素,对每个元素要提供多个实参,如果再考虑到构造函数有默认参数的情况,很容易造成实参与形参的对应关系不清晰,出现歧义性。
   5、构造函数有多个参数,在建立对象数组时,分别调用构造函数,对每个元素初始化。每一个元素的实参分别用括号包起来,对应构造函数的一组形参,不会混淆。

例6 对象数组的使用方法。
#include <iostream>
using namespace std;

class Box
   { public:
      Box(int h=10,int w=12,int len=15):height(h),width(w),length(len){ }
//声明有默认参数的构造函数,用参数初始化表对数据成员初始化
      
int volume();
     private:
      int height;
      int width;
      int length; };

int Box::volume()
 { return(height*width*length); }

int main()
 { Box a[3]={    //定义对象数组
   
Box(10,12,15), //调用构造函数Box,提供第1个元素的实参
   
Box(15,18,20), //调用构造函数Box,提供第2个元素的实参
   
Box(16,20,26) //调用构造函数Box,提供第3个元素的实参
  
};
cout<<"volume of a[0] is "<<a[0].volume()<<endl;//调用a[O]的volume函数
cout<<"volume of a[0] is "<<a[1].volume()<<endl;//调用a[1]的volume函数
cout<<"volume of a[0] is "<<a[2].volume()<<endl;//调用a[2]的volume函数
return 0; }

运行结果如下:
   volume Of a[0] is 1800
   volume Of a[l] is 5400
   volume Of a[2] is 8320

 

二、 对象指针

指针可以用来指向一般的变量,也可以指向对象。

1、 指向对象的指针

   在建立对象时,编译系统会为每一个对象分配一定的存储空间,以存放其成员。对象空间的起始地址就是对象的指针。可以定义一个指针变量,用来存放对象的指针。

定义指向类对象的指针变量的一般形式为:类名 *对象指针名;

例如:以下对象指针的定义、赋值语句:
      Time *pt; //定义Pt为指向Time类刈象的指针变量
      
Time tl;  //定义tl为Time类对象
      
pt=&tl;   //将t1的起始地址赋给pt

如果 有—个类:
   
class Time
      { public:
         int hour:
         int minute:
         int sec;
         void get_time();
      };
   void Time::get_time()
     { cout<<hour<<":" <<minute <<":"<<sec<<endl;}

   这样,Pt就是指向Time类对象的指针变量,它指向对象t1。 可以通过对象指针访问对象和对象的成员。如:
   *pt           pt所指向的对象,即t1
   
(*pt).hour     pt所指向的对象中的hour成员,即t1.hour
   
pt->hour       pt所指向的对象中的hour成员,即t1.hour
   
(*pt).get_time()调用pt所指向的对象中的get_time函数,即t1.get_time
   pt->get_time()  调用pt所指向的对象中的get_time函数,即t1.get_time

2、 指向对象成员的指针

   对象有地址,存放对象初始地址的指针变量就是指向对象的指针变量。对象中的成员也有地址,存放对象成员地址的指针变量就是指向对象成员的指针变量。

(1)指向对象数据成员的指针
   
定义指向对象数据成员的指针变量的方法和定义指向普通变量的指针变量方法相同。

   定义指向对象数据成员的指针变量的一般形式为:
   数据类型名 *指针变量名;

例如:int *p1; //定义指向整型数据的指针变量
   
如果Time类的数据成员hour为公用的整型数据,则可以在类外通过指向对象数据成员的指针变量访问对象数据成员hour。
   pl=&t1.hour;    //将对象tL的数据成员hour的地址赋绐p1,P1指向t1.hour
   
cout <<*p1<<endl;//输出t1.hour的值

(2)指向对象成员函数的指针

   需要注意:定义指向对象成员函数的指针变量的方法和定义指向普通函数的指针变量方法有所不同。这里重温一下指向普通函数的指针变量的定义方法:

   数据类型名 (*指针变量名)(参数表列);

   如: void (*P)(); //p是指向void型函数的指针变量

可以使它指向一个函数,并通过指针变量调用该函数:
   p=fun;  //将fun函数的入门地址赋抬指针变量P。P就指向了函数fun
   
(*P)(): //调用fun函数
   
而定义一个指向对象成员函数的指针变量则比较复杂一些。如果模仿上面的方法将对象成员函数名赋给指针变量P: p=t1.get_time;//  则会出现编译错误。

指向成员函数的指针变量的定义的一般形式为:

      数据类型名 (类名::*指针变量名)(参数表列);

指针变量指向一个公用成员函数的一般形式为:

       指针变量名=&类名::成员函数名;

例: void (Time::*p2)(); //定义p2为第向Time类中公用成员函数的指针变量
    
p2=&Time::get_time;  //将Time类中公用成员函数get_time的地址赋给指针变量P2

注意:(Time::*p2)两侧的括号不能省略,因为()的优先级高于*。如果无此括号,就相当于:
      void Time::*(P2()); //这是返回值为void型指引的函数定义指向公用成员函数的

在系统中,也可以不写&,以和C语言的用法一致,但建议在写程序时不要省略&。

例7 有关对象指针的使用方法。
#include <iostream>
using namespace std;
class Time
   { public:
      Time(int,int,int);
      Int hour;
      int minute;
      int sec;
      void get_time(); //声明公有成员函数
    
};
Time::Time(int h,int m,int s) //定义构造函数
   
{ hour=h;
     minute=m;
     sec=s; }
void Time::get_time()    //定义公有成员函数
  
{ cout<<hour<<":"<<minute<<":"<<sec<<endl;}

int main()
 { Time t1(10,13,56); //定义Time类对象t1
   
int *p1=&t1.hour; //定义指向整数数据的指引变量p1,并使P1.hour
   
cout<<*p1<<endl;  //输出pl所指的数据成员t1.hour
   
t1.get_time();   //调用对象t1的成员函数get_time
   
Time *p2=&t1;    //定义指向Time类对象的指引变量P2,并使P2指向t1
   
p2->get_time();  //调用p2所向对象(即t1)的get_time函数
   
(*p2). get_time();
   void (Time::*p3)();//定义指向Time类公用成员函数的指针变量p3
   
p3=&Time::get_time;//使p3指向Time类公用成员函数ge_time
   
(t1.*p3)();       //调用对象t1中P3所指的成员函数(即t1.get_time())
   
return 0; }

程序运行结果为:

10 (main函数第4行的输出)
10:13:56 (main函数第5行的输出)
10:13:56 (main函数第7行的输出)
10:13:56 (main函数第8行的输出)
10:13:56 (main函数第11行的输出)

说明:
   
(1)从main函数第9行可以看出:成员函数的入口地址的正确写法是:&类名::成员函数名。不应写成:       p3=&t1.gel_time;    //t1为对象名
   
成员函数不是存放在对象的空间中的,而是存放在对象外的空间中的,如果有多个同类的对象,它们共用同一个函数代码段。因此赋给指针变量p3的应是这个公用的函数代码段的入口地址。
   (2)main函数第8、9两行可以合写为一行:
      void(Time::*p3)()=&Time::get_time; //定义指针变量时指定其指向

3、 this 指针

   每个对象中的数据成员都分别占有存储空间,如果对同一个类定义了n个对象,则有n组同样大小的空间以存放n个对象中的数据成员。但是,不同的对象都调用同一个函数代码段。那么,当不同对象的成员函数引用数据成员时,怎么能保证引用的是所指定的对象的数据成员呢?

   在每一个成员函数中都包含一个特殊的指针,这个指针的名字是固定的,称为this。它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。

需要说明:
   
1、这些都是编译系统自动实现的,编程序者不必人为地在形参中增加this指针,也不必将对象a的地址传给this指针。这里写出以上过程,只是为了使读者者理解this指针的作用和实现的机理。
   2、 在需要时也可以显式地使用this指针。例如在Box类的volume函数中,下面两种表示方法都是合法的、相互等价的。
      return(height*width*length); //隐含使用this指针
      
return(this->height*this->width t this->length); //显式使用this指针
   
3、this两侧的括号不能省略,不能写成*this.height。因为成员运算符“.”的优先级别高于指针运算符“*”,因此,*this.height就相当于*(this.height),而this.height是不合法的,编译出错。
   4、例6程序中定义的Box类,volume函数要计算height*width*length的值,实际上是执行:
      (this->height)*(this->width):(this->length)
由于当前this指向对象a,因此相当于执行:
      (a.height)*(a.width)*(a.length)

 

 

 

转自:http://210.44.195.12/cgyy/text/HTML/text/08.htm

 

 

对象数组对象指针 主要用于初学者参考学习。是我们的老师上课的时候的课件我觉得还是挺好的,多多支持啊 立即下载

相关推荐

语言传递对象指针

语言传递对象指针源码,传递对象指针,test,DLL_对象复制,DLL_对象释放,DLL_对象指针

对象指针数组的理解以及指针对象存储位置的理解

今天在研究infomap的源码的是否,发现里面定义了个Node的指针数组: Node **node = new Node*[Nnode]; for(i=0;i<Nnode;i++){ node[i]=new Node(i); degree[i]=0.0; } 对于Node **node = new Node*[Nnode],这一句比较好理解,就是在内存中申请了一片空间用...

jinking01的专栏 2878

C++基础学习(5)——对象数组对象指针

文章目录五、对象数组对象指针1. 对象数组的定义和使用2. 指向对象指针3. 类成员指针数据成员指针成员函数指针使用类成员指针4. this指针 五、对象数组对象指针 1. 对象数组的定义和使用 将具有相同类类型的对象有序的集合在一起构成了对象数组,以一维对象数组为例,定义形式为: Point points[100]; //类名 对象数组名[常量表达式]; 说明: 在建立对象数组的时候需要调用构造函数,有多少个对象就要调用多少次构造函数 如果对象数组所属类有带参数的构造函数,可用初

qq_41985514的博客 1233

【C++】(二十三)对象数组对象指针

对象数组对象指针 1 对象数组的定义和使用 可以简单的理解类就是我们自定义的数据类型,而对象就是类的实 例,因此我们也可以构造对象数组对象指针。 将具有相同类类型的对象有序地集合在一起便构成了对象数组,以 一维对象数组为例,其定义形式为: 类名 对象数组名[常量表达式]; 一维对象数组有时也称为对象向量,它的每个元素都是相同类类型的对象。 例如表示平面上若干个点,可以这样定义: Point points[100]; //表示100个点 关于对象数组的说明: (1)在建立对象数组时,需要调用构造函数

weixin_44378835的博客 953

6.2 对象数组对象指针数组

类名> [];这表示dates是一个包含7个DATE类对象的一维数组

tang7mj的博客 790

对象指针数组

创建对象指针数组 一开始想太复杂,好几次遇到都不知道怎么下手 ...//这是从xx题中选取的片段 class Shape{//这是一个抽象基类 ... }; ... int main() { int t; cin>>t; while(t--){ Shape *s[3];//要求创建对象指针数组,可以这样创建 ... ...

在所不辞的博客 6081

从零开始学C语言系列之第八章《指针数组

​   以上关系表明了数组指针的关系十分密切,可以使用指针标识数组的元素和获得元素的值。可以认为*(ar +n)的意思是“到内存的 ar 位置,然后移动n个单元检索储存在那里的值”。因为计算机的硬件指令非常依赖地址,指针在某种程度上把程序员想要传达的指令以更接近机器的方式表达。只知道地址不够,因为计算机要知道储存对象需要多少字节(即使指针指向的是标量变量,也要知道变量的类型,否则*pt 就无法正确地取回地址上的值)。​ 而*(days+index)则是该元素的值,相当于 days[index]。

铁匠匠匠的博客 1736

数组指针、二级指针&NULL&void 指针

数组指针、二级指针&NULL&void 指针指针指向数组中的元素。数组指针数组指针定义。数组指针数组元素进行读写操作。指针数组。二级指针。NULL指针。void指针。二级指针---- 指针指针,就是一个用来存放另一个指针的地址。 NULL ---- 如果定义指针后不确定指针指向,那么需要让指针指向 NULL; 另外如果一块被指针指向的动态内存空间,使用完后,空间释放,释放后也需要将指针指向 NULL; void 指针----void 指针代表一块可以操作的空间,但是这块空间里面存放的数据类型

涛的博客 613

零基础学好C语言系列第八:初识指针

OK,今天的介绍就到这里,本章总体上感觉还是比较简单的,当然这是总体来说,有些概念可能有点难度,但相信你一定能行,希望大家都能有所收获。本人知识浅薄,如有错误,请大家指出,下一章介绍深入理解指针

chir_yb的博客 1148

第八章(一)-----变量指针数组指针

1. 指针指向某一类型变量的变量,所储存的值为它所指变量的地址,所以指针必须有机类型 指针拥有机类型,以便指针进行"+1","-1"的指向运算 2. * & 3. 通过指针 引用数组 (1)通过指针,引用一维数组 例子: 下标法 #include <stdio.h> int main(){ int a[10]; for(int i=0;...

mlm5678的博客 477

第八指针知识点

8.1指针是什么? 由于通过地址能够找到所需要的变量单元,可以说,地址指向该变量单元。打个比方,一个房间的门口挂了一个房间号2008, 这个2008就是房间的地址,或者说,2008“指向”该房间。因此,将地址形象地称为“指针”。意思是通过它能找到以它为地址的内存单元。 1.地址和内容 2.值和类型 1). int a=112,b=-1; float ...

qq_44911996的博客 1183

C语言数组指针区别:sizeof、&a+1二维数组陷阱详解

在C语言学习工程开发中,理解数据类型的底层表达是掌握指针内存模型的关键。数组作为一种连续内存区域,其名字看似指针相似,实则存在本质差异。C标准规定,数组名在绝大多数表达式中会退化为指向首元素的指针,但在sizeof操作、取地址运算及字符串初始化等特定场景下仍保持数组身份,这种规则直接影响了sizeof计算结果指针算术步长。例如,sizeof(a)返回整个数组字节数,而sizeof(a+1)则成为指针大小;&a + 1会跳过整个数组,说明数组指针元素指针的步长完全不同。在函数传参时,数组形参自动调整

weixin_34163553的博客 449

c语言程序设计第八指针,c语言程序设计第八指针

c语言程序设计第八指针Tag内容描述:1、第八指针,8.1 概 述,C程序设计中使用指针可以: 使程序简洁、紧凑、高效 有效表示复杂的数据结构 动态分配内存 方便使用字符串 有效使用数组 调用函数时可以得到多于1个的值 直接处理内存地址,8.2 指针的概念,一、数据的存取,1、内存地址,内存的每个字节都有一个编号,这个编号称为“内存地址”。,程序中的每个数据都对应着内存中的一个地址,从该地址...

weixin_39610366的博客 372

第八章:善于利用指针

类型名*指针变量名左端的int是在定义指针变量时必须指定的**“基类型”**。指针变量的基类型用来指定此指针变量可以指向的变量的类型。例如,上面定义的、基类型为int的指针变量pointer_1和pointer_2,可以用来指向整型的变量i和j,但不能指向浮点型变量a和b。说明在定义指针变量时要注意(1)指针变量前面的“*”表示该变量为指针型变量。指针变量名是pointer_1和pointer_2,而不是*pointer_l和*pointer_2。指定基类型。。。p=&a;”。。...

Cao_newbie的博客 544

第八章C++面试指针机制全面解析高级应用

摘要 本文深入解析C++指针机制,从基础概念到高级应用。指针作为C++核心特性,提供了直接内存操作能力,是高效数据结构和系统编程的基础。内容涵盖指针基本原理、内存操作、函数指针、this指针及引用机制,强调安全使用指针的重要性。通过详细代码示例展示指针声明、运算、动态内存管理及void指针应用,帮助读者全面掌握指针知识体系。文章指出,指针理解程度直接影响程序员水平,正确使用可实现高效灵活代码,而错误使用则可能导致严重问题。现代C++虽引入智能指针简化内存管理,但原始指针仍是底层编程不可或缺的工具。

小宝哥Code的专栏 934

第八周项目:指向学生类的指针

/* *Copyright(c)2016,烟台大学计算机学院 *All right reserved. *文件名称:test.cpp *作者:黄金婵 *完成日期:2016年5月24日 *版本号:v1.0 * *问题描述: 建立一个对象数组,通过初始化,设置5个学生的数据 *输入描述: *程序输出: 用指针指向数组首元素,输出第1、3、5个学生的信息 */ #

Elena0302的博客 649

C语言第八指针字符串

第一节 指针 普通变量的值是实际的值 指针变量的值是具有实际值的变量地址,存放的是a变量的地址,指向a 1.1定义指针:数据类型 *指针: int *x; float *f; char *ch; 1.2 取地址获取存储内容 (1) 获取地址运算符 &: 如 &i 取变量 i 的地址 (2)指针运算符 * :通过操作对象的地址获取存储的内容,如: x=&i, x为i的地址 ,*x通过i的地址获取i的内容分 // 声明普通变量,存放实际值10 int a=

buxiangdangcaiji的博客 1762
上一篇: 第七讲:构造函数与析构函数
下一篇: 第九讲:共用数据的保护与对象的动态处理
FG2006
博客等级 码龄19年 395粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值