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 }
浙公网安备 33010602011771号