思考:对于下面的三个对象,在调用相应的成员方法,那么在内部这个类是被怎么调用的?是复制三个相同的成员方法和成员数据来处理还是其他方式呢?
答:会复制三份成员属性,但是成员方法是公有的,通过this指针来判断是哪个对象在用成员方法。
class CGoods
{
private:
char Name[21];
int Amount;
float Price;
float Total_value;
public:
void RegisterGoods(char[],int,float);
void CountTotal(void);
void GetName(char[]);
int GetAmount(void);
float GetPrice(void);
float GetTotal_value(void);
}
int main()
{
CGoods c1,c2,c3;
c1.RegisterGoods("C++",12,98,99);
c1.CountTotal();
c2.RegisterGoods("Java",23,12,23);
c2.CountTotal();
c3.RegisterGoods("数据结构",23,34,56);
c3.CountTotal();
}
编译器对类的编译分为三步骤:
(1)识别属性成员,对属性成员记录下来,放到描述表中(明确类型具有的属性)
(2)对函数的声明进行识别,不进行函数体的识别
(3)进行改写,对函数的形参加上this指针
例如:
void CGood::CountTotal()
①加上this指针之后如下
void CGood::CountTotal(CGoods *this)
②在函数体中的形参中如果加了this指针,系统不改写,否则如果我们没有手动加上this指针,系统就会在编译的时候改写
③在主函数中,调用方法的时候加上(&c1),从而把这个地址给this指针
//c1.CountTotal(&c1);//编译的时候加上对象的地址
④this在类的成员函数里面,不在对象里面,是编译的时候加上去的
通过this从而使得方法为每一个对象共享
为了避免将this设为NULL,C++会加上const——CGoods * const this
这一句Test::SetValue(a,b),error,因为没有对象,this指针没法指向对象的地址