c++笔记 | 类和对象(二)

一.对象指针和对象引用

1.1 指向类的成员指针

指向成员的指针只能访问公有成员

  • 声明指向公有数据成员的指针 : 类型说明符  类名::*指针名  
  • 说明指针指向哪个成员  : 指针名 = & 类名::数据成员名

        eg:int  A::*pc=&A::c;  定义了一个类型为int型的指向A中数据c的指针

  • 通过对象名(或对象指针)与成员指针结合来访问数据成员 : 对象名.*类成员指针名; 对象指针名->*类成员指针名

        eg:A a; a.*pc=8;    A *p;p->*pc=8; 

  • 声明指向公有成员函数的指针 : 类型说明符 (类名::*指针名)(参数表)
  • 初始化: 指针名=类名::函数成员名

        eg:int (A::*pfun)(int)=A::fun; 定义了一个int类型指向A中函数fun的指针,fun的参数为一 个int型。

  • 通过对象名(或对象指针)与成员指针结合来访问函数成员:(对象名.*类成员指针名)(参数表)  (对象指针名->*类成员指针名)(参数表)

        eg:A a;a.*pfun(9);  A *p; p->*pfun(9);

1.2 对象指针和对象引用作函数参数

  • 对象指针作为函数参数

实现传址调用

使用对象指针作为形参仅将对象的地址值传给形参,提高运行效率。

  • 对象引用作函数参数

实现传址调用

比指针更简单、更直接

1.3 this指针

  • 隐含于每一个类的成员函数中的特殊指针。
  • 明确地指出了成员函数当前所操作的数据所属的对象。
  • 当通过一个对象调用成员函数时,系统先将该对象的地址赋给this指针,然后调用成员函数,成员函数对对象的数据成员进行操作时,就隐含使用了this指针。

二.对象数组和对象指针数组

2.1对象数组

相同类的若干个对象的集合构成一个对象数组

  • 声明:类名 数组名[元素个数]
  • 访问方法:通过下标访问 数组名[下标].成员名

对象数组初始化

数组中每一个元素对象被创建时,系统都会调用类构造函数初始化改对象

通过初始化列表赋值:eg: Point A[2]={Point(1,2),Point(3,4)}

如果没有为数组元素指定显示初始值,数组元素便使用默认值初始化(调用默认构造函数)

2.2 指向数组的指针和指针数组

2.2.1 指向数组的指针

指向数组的指针可以指向一维对象数组,也可以指向二维数组

指向一维数组的一级指针声明: 类名 (*指针名)[大小]

eg: A aa[2][3];

        A(*paa)[3]=aa;  

        定义了一个数组指针,指向aa,长度为3。

#include <iostream>
using namespace std;
     class A
     {
       public:
         A(int i,int j) //成员函数
         {  x=i;y=j;  }
         A()  //函数重载
         {  x=y=0;  }
         void Print()
         {  cout<<x<<','<<y<<'\t';  }
       private:
         int x,y;
     };
int main()
     {
         A aa[2][3]; //创建对象
         int a(3),b(5);
         for(int i(0);i<2;i++)
         for(int j(0);j<3;j++)
                 aa[i][j]=A(a++,b+=2);
         A (*paa)[3]=aa;  //数组指针
         for(i=0;i<2;i++)
         {
             for(int j=0;j<3;j++)
                  (*(*(paa+i)+j)).Print();
             cout<<endl;
         }
     }

2.2.2 指针数组

指针数组是指数组的元素是指向对象的指针,要求所有数组元素都是指向相同类的对象的指针。

声明: 类名 *对象指针数组名[大小]; 对象指针数组可以被初始化也可以被赋值

eg: A *arry1[4]={&a4,&a3,&a2,&a1};

#include <iostream>
using namespace std;
class A
{
public:
A(int i=0,int j=0)
{  x=i;y=j;  }

void Print()
{  cout<<x<<','<<y<<endl;}

private:
       int x,y;
};  
  int main()
     {
         A a1,a2(5,8),a3(2,5),a4(8,4);
         A *array1[4]={&a4,&a3,&a2,&a1}; //定义指针数组,并赋值
         for(int i(0);i<4;i++)
             array1[i]->Print(); //使用指针数组访问对象中的成员函数
         cout<<endl;
         A *array2[4];
         array2[0]=&a1; //初始化
         array2[1]=&a2;
         array2[2]=&a3;
         array2[3]=&a4;
         for(i=0;i<4;i++)
             array2[i]->Print();
         return 0;
     }

三.常类型

3.1 常对象

const 类名 对象名(初值);

类名 const 对象名 (初值);

3.2 常指针和常引用

3.2.1 常指针——地址为常量的指针  :类型 *const 指针名=初值

int a=0;

eg:int *const p1=&a;

        指向的值为常量的指针: const 类型 *指针名= 常量;

eg:const int *p2=&a;

3.2.2 常引用 :const 类型 &引用名 =初值;

eg:const int &c =a;

3.3常数据成员

格式:const 类型 常数据成员名

常数据成员的值不能改变

3.4 常成员函数

类型 成员函数名 (参数表) const

{函数体}

常成员函数可以引用const数据成员,也可以引用非const数据成员,非const数据成员在常成员函数中可以引用,但不可改变。

常对象的数据成员都是常数据成员,其值不能变。

常对象只能调用常成员函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_61756086

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值