16.1.24
一、调用构造函数与析构函数的顺序
先构造的后析构,后构造的先析构(类似于栈)。
二、对象数组
数组不仅可以有简单对象组成,也可以由类对象组成。
如:
Student stud[3];
如果数组有多个实参,可以如下定义
Student stud[3]={student(1001,18,87),student(1002,19,76),student(1003,78,72)};
实例:
#include<fstream>
#include<iostream>
#include<string>
#include<vector>
#include<iomanip>
using namespace std;
class box
{public:
box(int h=10,int w=12,intlen=15):height(h),width(w),length(len){
}
int volume(); \\定义函数一定要带()!!
private:
intheight;
intwidth;
intlength;
};
int box::volume(){
return(height*width*length);
}
int main(){
boxa[3]={
box(2,3,4),box(2,4,5),box(3,5,6)};
cout<<a[0].volume()<<endl;
cout<<a[1].volume()<<endl;
cout<<a[2].volume()<<endl;
}
三、对象指针
①指向对象的指针
在建立对象时,编译系统为每一个对象分配一定存储空间。对象空间的起始地址就是对象指针。
类名 *对象指针名
class time
{
public:
inthour;
intminute;
intsec;
voidget_time();
};
void get_time::()
{cout<<hour<<':'<<minute<<':'<<sec<<endl;
}
Time *p;
Time t;
P=&t;
②指向对象成员的指针
对象中的成员也有地址,存放对象成员地址的指针变量就是指向对象成员的指针变量。
Int *p;
P=&t.hour;
③指向对象成员函数的指针
指向对象成员函数的指针变量的方法和定义指向普通函数的指针不同
普通函数类型名(*指针变量名)(参数列表)
Void(*P)()\\ p是指向void型函数的指针
定义指向成员函数的指针
数据类型名(类名::*指针变量名)();
Void(time::*p)()
指针变量名=&类名::成员函数名
P=&time::get_time;
using namespace std;
class time
{
public:
time(inth,int m,int s);
inthour;
intminute;
intsec;
voidget_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 t(3,4,5);
int *p1=&t.hour;
cout <<*p1<<endl;
t.get_time();
time *p2=&t;
p2->get_time();
void(time::*p3)();
p3=&time::get_time; \\成员函数名,没有()!!
(t.*p3)();
}
④this指针
This指针指向本来对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。
Int box::volume(){ },c++处理为int box::volume(box*this){return(this->height*this->width*this->length);}
*this代表this所指的成员函数
四、常对象
①类名 const 对象名(实参数)
或者:const 类名对象名(实参数),常对象有必要初始化,初始化过后不能改变。
②常数据成员
可以通过构造函数的参数初始化表对常数据成员进行初始化。不能对常数据成员进行赋值。
Time::time(int h){
Hour=h;} \\错误,不能进行赋值!!
Time::time(int h):hour(h){}
③常成员函数
类型名 函数名(参数表)const
④指向对象的常指针
Int const *p,consint *p\\p为指针常量,不能通过p来改变变量的值
Int *const p \\ p的所指不能改变
Cons int &t1=t \\t1是对t的引用,二者指向同一存储空间,t的值不能改变