1 #include<stdio.h>
 2 #include<iostream>
 3 #include<string>
 4 using namespace std;
 5 class A{
 6     int m_b;//前面没有级别声明则默认为私有成员
 7 public:
 8     void SetA(int a, int b,int d){
 9         m_a = a; //类内部可以访问私有成员m_a;
10         m_b = b;
11         m_d = d;
12     }
13     int m_c; // 公有成员,类里类外均可以访问
14 private:
15     int m_a;
16 protected:
17     int m_d;
18 };
19 class B:public A{
20 public:
21     void SetB(){
22         SetA(1,2,3);// 基类公有成员作为派生类公有成员
23     //    m_a = 7;//error C2248: 'm_a' : cannot access private member declared in class 'A'
24         //任何继承方式的继承都不能访问基类私有成员
25         m_d = 5; // 基类保护成员在派生类中仍然是保护成员,可以访问。
26     }
27 };
28 class C:protected A{
29     void SetC(void){
30         SetA(4,5,6); //protected能访问基类公有成员
31         m_d = 1; //保护继承能访问基类保护成员
32     //    m_a = 4; // 保护继承不能访问基类私有成员
33     }
34 };
35 class D:private A{
36     void SetD(void){
37         SetA(4,5,6); //私有继承派生类能访问基类公有成员
38         m_d = 1; //私有继承派类能访问基类保护成员
39         //m_a = 4; // 保护继承不能访问基类私有成员
40     }
41 };
42 /*void A::SetA(int a,int b){
43     m_a = a;
44     m_b = b;
45 }*/
46 int main(){
47     A a;
48     B b;
49     C c;
50     D d;
51     a.SetA(1,5,6);
52     b.m_c = 9;//B是公有继承,在公有成员在派生类中仍然作为公有成员
53 //    c.m_c = 9; //C是保护继承,在公有成员变量在派生类中为保护成员变量,对象不能访问。
54     //d.m_c = 1; // D是私有继承,基类中公有成员变量在派生类中为私有成员变量,对象均不能访问。
55     //b.m_d = 4; // 不管公有继承还是保护继承,基类中保护继承均在派生类中为保护成员,对象均不能访问。
56 //    b.m_b = 7; //: error C2248: 'm_b' : cannot access private member declared in class 'A'
57        // F:\C information\getnumofcolumn.cpp(7) : see declaration of 'm_b'
58 //    c.m_d = 0;//F:\C information\getnumofcolumn.cpp(30) : error C2248: 'm_d' : cannot access protected member declared in class 'A'
59       // F:\C information\getnumofcolumn.cpp(18) : see declaration of 'm_d'
60     // 对象不能访问保护成员和私有成员
61     return 0;
62 }

类成员包括成员函数和数据成员。
类的成员属性:公有和私有、保护。
类内部可以访问任何成员。
对象只能访问公有成员,不能访问保护成员和私有成员。
派生类不能访问基类私有成员,但是有些时候为了让派生类访问私有成员,所以把部分私有成员作为保护成员,但是对于对象来说,对象不能访问类的私有和保护成员。
根据基类的成员属性是否改变的把继承分为公有继承,保护继承,私有继承。
公有继承:基类原来公有成员和保护成员在派生类中保持不变,即公有的为公有,保护成员仍然为保护成员。保护继承则把基类原来公有成员改为保护成员,基类保护成员仍然为
保护成员。私有继承彻底改变了基类成员属性,原来公有和保护的均变为私有继承。

继承属性的传递:

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<string>
 4 using namespace std;
 5 class A {
 6 public:
 7     int m_a;
 8 };
 9 class B:protected A{
10 };
11 class C:public B{
12 };
13 int main(){
14     C c;
15     c.m_a;//error C2248: 'm_a' : cannot access public member declared in class 'A'
16     return 0;
17 }

由于类B是保护继承A,则在类B中,则类B中m_a为保护成员,当C公有继承B时,m_a访问控制没有改变,仍为保护成员,所以对于对象c,不能访问类C保护成员。

静态数据成员:

在类前面加上关键字static,这种成员就是类的静态成员。类的静态成员包括静态数据成员和静态成员函数。静态成员和一般成员特殊在于:

静态数据成员属于类,不属于任何对象。无论有多少对象和没有对象,静态成员都只有一份存于公用的内存中,被该类的所有对象共享。静态成员可以是public、private、protected。由于对象不能访问静态成员,那静态成员三个属性有个卵用?在类中声明的静态成员属于引用性说明,并不实际分配内存。当创建对象时,会为对象的数据成员分配存储空间,但是由于静态数据成员不属于任何对象,所以常见对象时候也不为该类的静态数据成员分配存储空间。所以静态数据成员需要在类外进行定义:格式为:类型 类名 ::静态数据成员名 = 初值;


 1 class A {
 2 public:
 3     static int m_rate;
 4 };
 5 int A::m_rate = 2;//类外定义静态成员
 6 int main(){
 7     A a,b,*p;
 8     p=&a;
 9     cout<<A::m_rate<<endl;//1
10     cout<<a.m_rate<<endl;//2
11     cout<<p->m_rate<<endl;//3
12     cout<<b.m_rate<<endl;
13     return 0;
14 }

静态数据成员典型应用就是利率,由于利率对于大家来说都是一样的,如果为一般成员的话,那么当要修改利率时每个存款用户都要修改自己利率时很麻烦的,如果为静态变量,为所有用户共享,只需要在类外定义时修改,非常方便。  上述代码中第3行声明利率为类静态成员,第5行定义了利率的值,注意第5行中没有带上关键字static,原因是防止与一般静态变量混淆。注意:程序中对一个静态成员定义只能出现一次。

类的(公有)静态数据成员访问方式有三种方式:

 1、类名::静态成员名 。  参见代码第9行

 2、对象名.静态成员名。     参见上面代码第10行

 3、对象指针->静态成员名。   参见上面代码第11行

 

上面讲到3种方式为类的公有静态数据成员访问方式,但是对于类私有静态数据成员访问就不能这样显示访问了,如下代码4个错误。而是需要使用静态成员函数来间接访问。

 1 class A {
 2 private:
 3     static int m_rate;
 4 };
 5 int A::m_rate = 2;//类外定义静态成员
 6 int main(){
 7     A a,b,*p;
 8     p=&a;
 9     cout<<A::m_rate<<endl;//1  cannot access private member declared in class 'A'
10     cout<<a.m_rate<<endl;//2
11     cout<<p->m_rate<<endl;//3
12     cout<<b.m_rate<<endl;
13     return 0;
14 }

注意对类静态数据成员定义仍然可以在类定义,如下代码是没有错误的。

1 class A {
2 private:
3     static int m_rate;
4 };
5 int A::m_rate = 2;//类外定义静态成员
6 int main(){
7     return 0;
8 }

静态成员函数,同样道理,如果成员函数前面加static关键字,则该成员函数为静态成员函数。静态成员函数与具体对象无关,静态成员函数只能访问静态数据成员,不能访问一般数据成员,也只能调用其它静态数据函数。

对类的静态成员函数的调用形式:

1、  类名::静态成员函数调用

2、类对象.静态成员函数调用

3、指向类对象的指针  ->静态成员函数调用

同样此时的调用只是对象的类型,与具体对象无关。



 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<string>
 4 using namespace std;
 5 class A {
 6 public:
 7     static void SetRate(int m);
 8     static int GetRate();
 9 private:
10     static int m_rate;
11 };
12 int A::m_rate = 2;//类外定义静态成员
13 void A::SetRate(int m){
14      m_rate = m;
15 }
16 int A::GetRate(){
17     return m_rate;
18 }
19 int main(){
20     A a,*p,b;
21     p = &a;
22     a.SetRate(4);
23     cout<<a.GetRate()<<endl;
24     cout<<p->GetRate()<<endl;
25     cout<<A::GetRate()<<endl;
26     //cout<<A::m_rate<<endl;//error C2248: 'm_rate' : cannot access private member declared in class 'A'
27     return 0;
28 }


 

 

 

 

 

 

 

 

 


 

 

posted on 2015-10-10 18:34  一页骈文  阅读(545)  评论(0编辑  收藏  举报