C++编程学习(第38天)
对象数组
数组不仅可以由简单变量组成,也可以由类对象组成,对象数组的每一个元素都是同类的对象。
编译系统只为每个对象元素的构造函数传递一个实参,所以在定义数组时提供的实参个数不能超过数组元素个数。如果构造函数有多个参数,在定义对象数组时应当在花括号中分别写出构造函数名并在括号内指定实参。
在建立对象数组时,分别调用构造函数,对每个元素初始化,每一个元素的实参分别用括号括起来,对应构造函数的一组形参,不会混淆。
例1:输出三个立方体的体积,用对象数组方法。
#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, width, length;
};int Box::volume()
{return(height * width * length);
}int main()
{Box a[3] = {Box(10,10,10),Box(20,20,20),Box(30,30,30)};cout << "v1 = " << a[0].volume() << endl;cout << "v2 = " << a[1].volume() << endl;cout << "v3 = " << a[2].volume() << endl;return 0;
}
对象指针
指向对象的指针
在建立对象时,编译系统会为每一个对象分配一定的存储空间,以存放其数据成员,对象空间的起始地址就是对象的指针。可以定义一个指针变量,用来存放对象的地址,这就是指向对象的指针变量。
定义指向类对象的指针变量的一般形式为
类名 * 对象指针名;
可以通过对象指针访问对象和对象的公用成员
指向对象成员的指针
对象有地址,存放对象的起始地址的指针变量就是指向对象的指针变量;对象中的成员也有地址,存放对象成员地址的指针变量就是指向对象成员的指针变量。
1、指向对象数据成员的指针
定义指向对象数据成员的指针变量的方法和定义指向普通变量的指针变量方法相同。
定义指向对象数据成员的指针变量的一般形式为
数据类型名 * 指针变量名;
2、指向对象成员函数的指针
定义指向对象成员函数的指针变量的方法和定义指向普通函数的指针变量方法有所不同。
指向普通函数的指针变量的定义方法:类型名(*指针变量名)(参数列表)
定义指向公用成员函数的指针变量的一般形式为
数据类型名 (类名::*指针变量名)(参数列表);
使指针变量指向一个公用成员函数的一般形式为 指针变量名=&类名::成员函数名;
例2:用不同的方法输出时间记录的时分秒,使用对象指针的方法。
#include <iostream>
using namespace std;class Time
{
public:Time(int, int, int);int hour, minute, 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, 20, 30); //定义Time类对象t1并初始化int* p1 = &t1.hour; //定义指向整型数据的指针变量p1,并使p1指向t1.hourcout << *p1 << endl; //输出p1所指的数据成员t1.hourt1.get_time(); //调用对象t1的成员函数gt_timeTime* p2 = &t1; //定义指向Time类对象的指针变量p2,并使p2指向t1p2->get_time(); //调用p2所指向对象(即t1)的get_time函数void(Time:: * p3)(); //定义指向Time类公用成员函数的指针变量p3p3 = &Time::get_time; //使p3指向Time类公用成员函数get_time(t1.*p3)(); //调用对象t1中p3所指的成员函数,即t1.get_time()
}
指向当前对象的this指针
在每一个成员函数中都包含一个特殊的指针,这个指针的名字是固定的,称为this。它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。
this指针是隐式使用的,它是作为参数被传递给成员函数的。
所谓调用对象a的成员函数f,实际上是在调用成员函数f时使this指针指向对象a,从而访问对象a的成员。