类的成员访问方式可以分为两类
一、没有实例化对象的访问
class controller
{
public;
static void func();
protected:
int a;
int b;
};
int main()
{
controller::func();
}
没有实例化的对象,可以通过类名+::
的方式访问成员函数,但是只能访问静态成员函数。
二、具有实例化对象的访问
具有实例化的对象时,在访问成员函数时,有两种方式:
int main()
{
//对象名+`.`
controller mpc;
mpc.func();
// 指针
controller *p = new controller();
p->func();
//或者
controller lqr;
controller *p = &lqr;
p->func();
}
三、什么是静态成员和非静态成员
1、静态数据成员
- 静态数据成员是被所有的类对象共享的,也就是说无论创建了多少了对象静态数据成员就只有一份,只要有一个对象修改了静态数据成员,其他对象的该成员也会改变。简单的说,就是所有对象都使用这一个数据成员,并不是每个对象单独一个。
- 静态成员变量在对象创建之前就已经被分配了内存空间。
- 由于静态数据成员先于类的实例化对象而存在,因此,访问静态数据成员不能通过类的实例化对象访问,可以直接通过类的作用符
::
访问,即static int Np; controller::Np;
- 静态成员不属于类的任何对象,所以并不是对象建立时被定义的,所以它不能由类的构造函数初始化,一般也不能在类内初始化。
- 关键字static只出现类的内部。
- 在类外定义且初始化,初始化的格式如下:数据类型 类名::静态成员变量名 = 初值;
- 不能用参数初始化表,对静态成员变量进行初始化。因为初始化列表是构造函数独有,而静态成员数据不能用构造函数初始化(静态数据成员先于对象,不属于任何一个对象)。
- 常量静态成员可以在类内初始化
类的静态数据成员的访问
- 使用类的对象访问
- 成员函数可以直接访问
- 类作用符
::
直接访问
2、非静态数据成员
- 非静态数据成员,类的每个实例都有一份拷贝(动态区)。
非静态数据成员的访问
非静态数据必须通过类的实例化对象访问,常用的访问方式有以下两种:
4、静态成员函数
- 被说明为static的成员函数,由一个类的所有对象共享。
- 引入静态成员函数的目的:访问同一类中的静态数据成员,维护对象之间共享的数据。
-
一般而言,静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象。静态成员函数没有隐含的
this
指针。所以,它就无法访问自己类的非静态成员。
静态成员函数的调用方式:
在类外调用,两种方式
- 类名::静态公有成员函数名(实参表)
- 对象名.静态公有成员函数名(实参表)
在类内调用:
静态成员函数访问本类成员的权限
- 可以直接访问该类的静态数据和静态函数成员
- 访问非静态数据成员,必须通过参数传递方式得到对象名,再通过对象名来访问
5、非静态成员函数(普通成员函数)
- 非静态成员函数属于类的实例化对象所有,所以只有在创建类的实例化对象的时候才会分配内存,访问类的非静态函数要通过对象来实现。
- 非静态成员函数通过对象(或对象指针)来访问,有this指针。
总结:
- 静态数据成员:是类的一部分,为类的所有实例共享(静态区)
- 非静态数据成员:类的每个实例都有一份拷贝(动态区)
- 静态数据成员先于类的实例化对象而存在,没有有this指针;非静态数据成员存在于类的实例化对象之后,具有this指针
四、this指针
1、什么是this
指针
-
在建立对象时,系统会为每一个对象分配独立的存储空间,也就是给每个对象中的数据成员都分配有自己独立的存储空间。
-
如果对同一个类定义多个对象,则有多个同样大小的空间存放对象中的数据成员,但对于成员函数来说,一个函数的代码段在内存中只有一份。也就是说,同一个类中的不同对象在调用自己的成员函数时,其实它们调用的是同一段函数代码。
-
那么,当一个对象调用自己的成员函数时,如何保证成员函数中对数据成员的处理是针对自己的数据成员而不是其他对象的数据成员呢?
答案就是:this指针
具体来说,就是,每一个非静态成员函数中都包含一个隐藏的this指针
2、this
指针存放的地址是什么
this
指针记录的是当前对象的内存地址,也就是this指针指向当前对象
3、this
指针的特点
- this指针的类型:类类型* const
- this指针并不是对象本身的一部分,不影响sizeof的结果
this
指针的作用域在类成员函数的内部
- this指针是”类成员函数”的第一个默认隐含参数,编译器自动维护 传递,类编写者不能显式传递
- 只有在类的非静态成员函数中才可以使用this指针,其它任何函数都不可以
this
指针示例:
class A
{
public:
void set(int x)
{
this->a = x;
}
void print()
{
cout << "this" << this << endl;
}
private:
int a;
};
int main()
{
A a1;
cout << "&a1=" <<&a1<< endl;
a1.print();
}