C++保护成员(protected)的访问
实验目的
掌握C++中访问控制符protected的相关知识
实验内容
前言
我们知道,在C++中,类的成员可以是私有成员(private)和公有成员(public),但除了这两种之外,还可以用protected访问控制符修饰类的成员,从而称为“保护成员”。
详细介绍
protected作为C++中的访问控制符,被标明为protected的成员只能在本类以及其继承类和友元中访问;所以保护成员的可访问范围比私有成员大,因为派生类无法直接访问私有成员,但是可以直接访问保护成员,这也是保护成员的意义所在。
因为派生类从基类公有继承时,他是不能访问基类的私有成员的,但又有一些出于隐藏的目的不宜设为共有,但又确实需要在派生类的成员函数中经常访问的基类成员,这时将他们设为保护成员,既能起到隐藏的目的,又避免了派生类成员函数要访问它们时只能间接访问所带来的麻烦。
不过需要注意的是,派生类的成员函数只能访问当前所作用的那个对象(即this指针指向的对象)的基类保护成员,不能访问其他基类对象的基类保护成员。如下:
#include <iostream>
using namespace std;
class testclass_one
{
public:
int numpublic;
void test1()
{
numprotected=12;
cout<<"本类访问保护成员:"<<numprotected<<endl;
}
friend void testf(testclass_one& y);
private:
int numprivate;
protected:
int numprotected;
};
void testf(testclass_one& y)
{
y.numprotected=13;
cout<<"友元访问保护成员:"<<y.numprotected<<endl;
}
class testclass_two:public testclass_one
{
public:
void test2()
{
numpublic=10;
cout<<"派生类访问:"<<endl;
cout<<"访问公有成员:"<<numpublic<<endl;
numprotected=11;
cout<<"访问保护成员:"<<numprotected<<endl;
testclass_one one;
//one.numprotected=11;//错误,如前文所说,
//当前函数仅能访问当前this指针指向的对象的保护成员,不能访问其他对象的保护成员
}
};
int main()
{
testclass_one n1;
testclass_two n2;
n1.numpublic=11;//仅仅可以访问n1对象的公有成员
//不能直接访问n1对象的私有成员和保护成员
n1.test1();
n2.test2();
testf(n1);
}
实验结论
保护成员是为了一些经常需要在派生类中访问但又不宜设为共有成员而设置的,它既能起到隐藏的目的,又避免了派生类成员函数要访问它们时只能间接访问所带来的麻烦