C++编程中私有和保护以及公有的类成员访问控制
private
语法
private: [member-list] privatebase-class
备注
当位于类成员列表之前时,private关键字指定这些成员仅可从成员函数和该类的友元中进行访问。这适用于声明到下一个访问指示符或类的末尾的所有成员。
当位于基类的名称之前时,private关键字指定基类的公共成员和受保护成员为派生类的私有成员。
类中成员的默认访问是私有的。结构或联合中成员的默认访问是公共的。
基类的默认访问对于类是私有的,而对于结构是公共的。联合不能具有基类。
例子
//keyword_private.cpp
classBaseClass{
public:
//privMemaccessiblefrommemberfunction
intpubFunc(){returnprivMem;}
private:
voidprivMem;
};
classDerivedClass:publicBaseClass{
public:
voidusePrivate(inti)
{privMem=i;}//C2248:privMemnotaccessible
//fromderivedclass
};
classDerivedClass2:privateBaseClass{
public:
//pubFunc()accessiblefromderivedclass
intusePublic(){returnpubFunc();}
};
intmain(){
BaseClassaBase;
DerivedClassaDerived;
DerivedClass2aDerived2;
aBase.privMem=1;//C2248:privMemnotaccessible
aDerived.privMem=1;//C2248:privMemnotaccessible
//inderivedclass
aDerived2.pubFunc();//C2247:pubFunc()isprivatein
//derivedclass
}
protected
语法
protected: [member-list] protectedbase-class
备注
protected关键字指定对member-list中的成员直到下一个访问说明符(public或private)或类定义的末尾的访问。只能通过以下项使用声明为protected的类成员:
最初声明这些成员的类的成员函数。
最初声明这些成员的类的友元。
使用公共或受保护访问(派生自最初声明这些成员的类)派生的类。
也对受保护成员具有专用访问权限的以私有方式派生的直接类。
当以基类的名称开头时,protected关键字指定基类的公共成员和保护成员是其派生类的保护成员。
保护成员不像private成员那样专用,private成员仅对从中声明它们的类的成员可访问,但保护成员也不像public成员那样公开,public成员在任何函数中均可访问。
也声明为static的保护成员对派生类的任何友元或成员函数均可访问。也声明为static的保护成员对派生类中的友元或成员函数可访问,但只能通过指向派生类的指针、对派生类的引用或派生类的对象。
例子
//keyword_protected.cpp
//compilewith:/EHsc
#include<iostream>
usingnamespacestd;
classX{
public:
voidsetProtMemb(inti){m_protMemb=i;}
voidDisplay(){cout<<m_protMemb<<endl;}
protected:
intm_protMemb;
voidProtfunc(){cout<<"\nAccessallowed\n";}
}x;
classY:publicX{
public:
voiduseProtfunc(){Protfunc();}
}y;
intmain(){
//x.m_protMemb;error,m_protMembisprotected
x.setProtMemb(0);//OK,usespublicaccessfunction
x.Display();
y.setProtMemb(5);//OK,usespublicaccessfunction
y.Display();
//x.Protfunc();error,Protfunc()isprotected
y.useProtfunc();//OK,usespublicaccessfunction
//inderivedclass
}
public
语法
public: [member-list] publicbase-class
备注
当位于类成员列表前面时,public关键字指定这些成员可从任何函数访问。这适用于声明到下一个访问指示符或类的末尾的所有成员。
当位于基类名称前面时,public关键字指定基类的公共和受保护成员分别是派生类的公共成员和受保护成员。
类中成员的默认访问是私有的。结构或联合中成员的默认访问是公共的。
基类的默认访问对于类是私有的,而对于结构是公共的。联合不能具有基类。
例子
//keyword_public.cpp
classBaseClass{
public:
intpubFunc(){return0;}
};
classDerivedClass:publicBaseClass{};
intmain(){
BaseClassaBase;
DerivedClassaDerived;
aBase.pubFunc();//pubFunc()isaccessible
//fromanyfunction
aDerived.pubFunc();//pubFunc()isstillpublicin
//derivedclass
}