c++的类/对象
类,是一种特殊的自定义类型,在实例化为对象时,会自动对成员进行初始化
1.类/对象的一些特性
对象的创建细节
- 当一个类实例化为一个对象时,会为其中的成员分配内存空间(所有成员默认private)。其中,成员变量集中放在对象的内存中(就和结构体一样),而成员函数是同一个类的所有对象公用的,单独定义在代码段,并不以函数指针的形式放在对象的内存中,由编译器在编译时直接链接到调用处
- 然后编译器连它们的初始化都给包办了,自动进行赋值,编译器先执行初始化列表,再执行构造函数,来为成员变量赋初始值
- 所以可以认为,从同个类中实例化而来的对象,它们的成员函数实质是同一个函数(入口地址相同)。那么问题来了,众所周知,成员函数可以直接访问成员变量,但是从同个类中实例化而来的对象,其成员函数如何区分自己和别人的成员变量呢?答案是隐藏的参数“this”,this的本质是一个指向当前对象自己的指针
class Test
{
int mi;
public:
Test(int i){ /*成员函数中隐藏的参数this,Test(int i, this)*/
mi = i; /*实际执行的是this->mi = i;*/
};
};
int main()
{
/*t1和t2是不同的对象,但同一个类,它们的构造函数Test(int i)实质是同一个函数,那么Test(int i)中如何确定mi是t1.mi还是t2.mi呢?*/
Test t1(1);
Test t2(2);
}
成员变量的访问权限
类中的所有成员默认为private,而成员变量的访问权限一般都应设为private/protected
- private权限范围是当前类(即可被当前类中的成员函数直接获取),protected权限范围是当前类和子类(即可被当前类和子类中的成员函数直接获取)。注意它们的范围是类,而不是对象
- 所以说,同一个类的不同对象,它们的成员函数是可以互相访问对方的成员变量的,一般用引用参数来实现:
class Test
{
int var;
public:
void Test(const Test &ori)
{
cout << ori.var << endl; //可用这种方式直接访问同类的成员变量
cout << var << endl; //对于自己的成员变量则可直接访问,这的var本质是this —> var
}
};
int main()
{
Test t1;
Test t2;
t1.test(t2);
return 0;
}