1、首先需要了解内存分布:
class Test1
{
public:
int i;//4
int j;//4
int k;//4
};
class Test2
{
public:
int i;
int j;
int k;
int geti(){return i;}
void seti(int val){i =val;}
};
int main()
{
Test1 a;
Test2 b;
cout<<sizeof(a)<<endl; //12
cout<<sizeof(b)<<endl; //12
return 0;
}
为什么两个对象的大小是一样的?因为类的成员函数在独立的代码段里面
2、 如果使用同一个类创建两个对象?那么他们调用同一个函数,编译器如何知道是谁调用了该函数呢?
class Test2
{
public:
int i;
int j;
int k;
//int geti(Test2* const this){return this->i}
//this 指针指向调用该成员函数的对象
int geti(){return i;}
void seti(int val){i =val;}
};
int main()
{
Test2 b;
Test2 c;
b.seti(100);
cout<<b.geti()<<endl; //100
c.seti(1000);
cout<<c.geti()<<endl; //1000
return 0;
}
当调用 b.get() 函数时,其实隐藏了形参 Test2 * const this,相当于int geti(Test2 *const this)
3、如果对象中的成员变量名称与构造函数形参名称一样的话,编译器该如何区分?
class Test
{
public:
int i;
int j;
int k;
Test(int i,int j,int k)
{
i=i;
j=j;
k=k;
}
};
int main()
{
Test t(10,20,30);
return 0;
}
实际上,编译器在内部会实现:this 指针指向调用该成员函数的对象