面对对象编程技术的一个重要特征是用一个对象把数据和对数据处理的方法封装在一起。
在前面的例子里,我们一直是在使用对象(也可以说某个类的实例)来调用方法,每个方法只处理调用它的那个对象所包含的数据,所有的数据都属于同一个对象。
C++允许我们把一个或多个成员声明为属于某个类,而不是仅属于该类的对象。(就是说这个类仅能让该类强暴)。好处是,程序员可以在没有创建任何对象的情况下调用有关的方法。另一个好处是能够让有关的数据仍在该类的所有对象间共享。
实例1:静态变量实例
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 }
45
46 class Cat:public Pet//定义Cat类继承于Pet类
47 {
48 public:
49 Cat(string theName);
50 };
51 Cat::Cat(string theName):Pet(theName)//Cat的构造函数继承于Pet类中的Pet(theName)函数
52 {
53 }
54
55 int main()
56 {
57 Dog dog("Tom");
58 Cat cat("Jerry");
59
60 cout << "\n已经诞生了" << Pet::getCount() << "只宠物!\n\n";
61 //如果有括号的话,编译器是在括号结束时调用dog_2与cat_2的析构函数,而没有的话,则是程序结尾处调用析构函数
62 // {
63 Dog dog_2("Tom_2");
64 Cat cat_2("Jerry_2");
65
66 cout << "\n现在呢,已经诞生了" << Pet::getCount() << "只宠物!";
67 // }
68 cout << "\n现在还剩下" << Pet::getCount() << "只宠物!";
69
70 return 0;
71 }