关于类成员的疑问
成员函数和成员变量都是隶属于具体对象吗?
成员变量必然是隶属具体对象的,那成员函数呢?
是不是每个对象都有自己的一套成员函数呢?答案否
从面向对象的角度
对象由属性(成员变量)和方法(成员函数)构成
从程序运行的角度
对象是由数据和函数构成
数据可以位于栈,堆和全局数据区
函数只能位于代码段
代码段是只读的,在程序运行阶段是不可以改变的。当编译器将最终的可执行程序编译好之后,代码段就确定了,不可以再进行更改。
对象可以动态的创建,动态的删除,对于数据而言,当然可以做到。
对于代码,这是不可能的。也就是说,在面向对象里面由于程序的特性,天生的决定了成员函数不可能每个对象都有一套的。只可能是所有的对象共享一套成员函数。就是因为代码段,不可能动态的添加和删除的。
结论:
-每一个对象都拥有自己独立的属性(成员变量)
-所有的对象共享类的方法(成员函数)
-方法能够直接访问对象的属性
-方法中的隐藏参数this用于指代当前对象
问题:如果所有的对象都共享一套成员函数,那么我们在调用成员函数的时候,函数本身它如何知道是哪个对象调用的呢?
方法中的隐藏参数this用于指代当前调用成员函数的对象。
用实例来证明:
#include <stdio.h>
class Test
{
int mi;
public:
int mj;
Test(int i);
Test(const Test& t);
int getMi();
void print();
};
Test::Test(int i)
{
mi = i;
}
Test::Test(const Test& t)
{
mi = t.mi;
}
int Test::getMi()
{
return mi;
}
void Test::print()
{
printf("this = %p
", this);
}
int main()
{
Test t1(1);
Test t2(2);
Test t3(3);
printf("t1.getMi() = %d
", t1.getMi());
printf("&t1 = %p
", &t1);
t1.print();
printf("t2.getMi() = %d
", t2.getMi());
printf("&t2 = %p
", &t2);
t2.print();
printf("t3.getMi() = %d
", t3.getMi());
printf("&t3 = %p
", &t3);
t3.print();
return 0;
}
该实例说明:
在类的成员函数中,有一个隐藏的参数,这个参数它是一个指针,并且这个指针的值就是调用这个函数所对应的对象的地址。
成员函数和普通函数是不一样的,成员函数有一个隐藏的参数this。
现在可以回答上篇博客中的那个问题了。
Test::Test(const Test& t)
{
mi = t.mi;
}
成员函数只有一套,成员函数能直接访问对应类的成员变量。拷贝构造函数是一种特殊的成员函数,因此就可以直接访问类的成员变量。因此t.mi是合法的。