规则:
静态成员是所有对象共享的,所以不能在静态方法里访问非静态的元素。(因为每个对象都有自己的this指针,静态方法不是属于某个特定的对象,而是由全体对象共享的,静态成员存储地址与对象并不在一起)
非静态方法可以访问类的静态成员,也可以访问类的非静态成员。
this指针是类的一个自动生成、自动隐藏的私有成员,它存在于类的非静态成员函数中,指向被调用函数所在的对象的地址。
当一个对象被创建时,该对象的this指针就自动指向对象数据的首地址。
当我们调用一个方法时,this指针都会随着你提供的输入参数被秘密的传递给那个方法。
实例1:this指针应用
1 #include <iostream>
2 #include <string>
3
4 using namespace std;
5 class Pet//定义Pet类
6 {
7 public:
8 Pet(string theName);//构造器,对count进行写操作
9 ~Pet();//析构器,对count进行写操作
10
11 static int getCount();//定义静态函数,对count进行读操作
12
13 protected://不允许没有继承Pet类的其它类调用
14 string name;
15 private://定义的变量和函数只服务于Pet类中的函数
16 static int count;//定义静态变量(属性)
17 };
18 int Pet::count = 0;//注意这一句,他起码做了两件事(为count分配静态内存,初始化为0) 外部对静态属性进行声明
19 Pet::Pet(string theName)//构造函数
20 {
21 name = theName;
22 count++;
23
24 cout << "一只宠物出生了,名字叫做:" << name << "\n";
25 }
26 Pet::~Pet()//析构函数
27 {
28 count--;
29 cout << "\n" << name << "挂掉了\n";
30 }
31 int Pet::getCount()//返回count值
32 {
33 return count;
34 }
35
36
37 class Dog:public Pet//定义Dog类继承于Pet类
38 {
39 public:
40 Dog(string theName);
41 };
42 Dog::Dog(string theName):Pet(theName)//Dog的构造函数继承于Pet类中的Pet(theName)函数,即该构造函数调用时将调用Pet函数
43 {
44 cout << "this:" << this << "\n";//打印this指针地址
45 }
46
47 class Cat:public Pet//定义Cat类继承于Pet类
48 {
49 public:
50 Cat(string theName);
51 };
52 Cat::Cat(string theName):Pet(theName)//Cat的构造函数继承于Pet类中的Pet(theName)函数
53 {
54 }
55
56 int main()
57 {
58 Dog dog("Tom");
59 Cat cat("Jerry");
60
61 cout << "dog:" << &dog << "\n";//打印指向dog对象的this指针地址
62 cout << "\n已经诞生了" << Pet::getCount() << "只宠物!\n\n";
63 //如果有括号的话,编译器是在括号结束时调用dog_2与cat_2的析构函数,而没有的话,则是程序结尾处调用析构函数
64 // {
65 Dog dog_2("Tom_2");
66 Cat cat_2("Jerry_2");
67
68 cout << "\n现在呢,已经诞生了" << Pet::getCount() << "只宠物!";
69 // }
70 cout << "\n现在还剩下" << Pet::getCount() << "只宠物!";
71
72 return 0;
73 }