初学C的朋友经常在类中看到publicprotectedprivate以及它们在继承中表示的一些访问范围很容易搞糊涂。今天本文就来十分分析一下C中public、protected及private用法。相信对于大家深入掌握C程序设计会有很大的帮助。这里我们首先要明白下面几点。1.类的一个特征就是封装public和private作用就是实现这一目的。所以用户代码类外可以访问public成员而不能访问private成员private成员只能由类成员类内和友元访问。2.类的另一个特征就是继承protected的作用就是实现这一目的。所以protected成员可以被派生类对象访问不能被用户代码类外访问。现来看看如下示例12345678910111213141516171819202122232425262728293031323334#includeiostream#includeassert.husingnamespacestd;classA{public:inta;A(){a1 1;a2 2;a3 3;a 4;}voidfun(){cout a endl;//正确cout a1 endl;//正确cout a2 endl;//正确类内访问cout a3 endl;//正确类内访问}public:inta1;protected:inta2;private:inta3;};intmain(){A itema;itema.a 10;//正确itema.a1 20;//正确itema.a2 30;//错误类外不能访问protected成员itema.a3 40;//错误类外不能访问private成员system(pause);return0;}继承中的特点先记住不管是否继承上面的规则永远适用有public, protected, private三种继承方式它们相应地改变了基类成员的访问属性。1.public继承基类public成员protected成员private成员的访问属性在派生类中分别变成public, protected, private2.protected继承基类public成员protected成员private成员的访问属性在派生类中分别变成protected, protected, private3.private继承基类public成员protected成员private成员的访问属性在派生类中分别变成private, private, private但无论哪种继承方式上面两点都没有改变1.private成员只能被本类成员类内和友元访问不能被派生类访问2.protected成员可以被派生类访问。再来看看以下代码1.public继承代码如下12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#includeiostream#includeassert.husingnamespacestd;classA{public:inta;A(){a1 1;a2 2;a3 3;a 4;}voidfun(){cout a endl;//正确cout a1 endl;//正确cout a2 endl;//正确cout a3 endl;//正确}public:inta1;protected:inta2;private:inta3;};classB :publicA{public:inta;B(inti){A();a i;}voidfun(){cout a endl;//正确public成员cout a1 endl;//正确基类的public成员在派生类中仍是public成员。cout a2 endl;//正确基类的protected成员在派生类中仍是protected可以被派生类访问。cout a3 endl;//错误基类的private成员不能被派生类访问。}};intmain(){B b(10);cout b.a endl;cout b.a1 endl;//正确cout b.a2 endl;//错误类外不能访问protected成员cout b.a3 endl;//错误类外不能访问private成员system(pause);return0;}2.protected继承代码如下123456789101112131415161718192021222324252627282930313233343536373839404142434445464748#includeiostream#includeassert.husingnamespacestd;classA{public:inta;A(){a1 1;a2 2;a3 3;a 4;}voidfun(){cout a endl;//正确cout a1 endl;//正确cout a2 endl;//正确cout a3 endl;//正确}public:inta1;protected:inta2;private:inta3;};classB :protectedA{public:inta;B(inti){A();a i;}voidfun(){cout a endl;//正确public成员。cout a1 endl;//正确基类的public成员在派生类中变成了protected可以被派生类访问。cout a2 endl;//正确基类的protected成员在派生类中还是protected可以被派生类访问。cout a3 endl;//错误基类的private成员不能被派生类访问。}};intmain(){B b(10);cout b.a endl;//正确。public成员cout b.a1 endl;//错误protected成员不能在类外访问。cout b.a2 endl;//错误protected成员不能在类外访问。cout b.a3 endl;//错误private成员不能在类外访问。system(pause);return0;}3.private继承代码如下123456789101112131415161718192021222324252627282930313233343536373839404142434445464748#includeiostream#includeassert.husingnamespacestd;classA{public:inta;A(){a1 1;a2 2;a3 3;a 4;}voidfun(){cout a endl;//正确cout a1 endl;//正确cout a2 endl;//正确cout a3 endl;//正确}public:inta1;protected:inta2;private:inta3;};classB :privateA{public:inta;B(inti){A();a i;}voidfun(){cout a endl;//正确public成员。cout a1 endl;//正确基类public成员,在派生类中变成了private,可以被派生类访问。cout a2 endl;//正确基类的protected成员在派生类中变成了private,可以被派生类访问。cout a3 endl;//错误基类的private成员不能被派生类访问。}};intmain(){B b(10);cout b.a endl;//正确。public成员cout b.a1 endl;//错误private成员不能在类外访问。cout b.a2 endl;//错误, private成员不能在类外访问。cout b.a3 endl;//错误private成员不能在类外访问。system(pause);return0;}通过以上的代码都备有较为详尽的注释读者应该能够理解。仔细看代码中派生类B中定义了和基类同名的成员a此时基类的a仍然存在可以验证。1234567intmain(){cout sizeof(A) endl;cout sizeof(B) endl;system(pause);return0;}输出1620所以派生类包含了基类所有成员以及新增的成员同名的成员被隐藏起来调用的时候只会调用派生类中的成员。如果要调用基类的同名成员可以用以下方法123456789intmain(){B b(10);cout b.a endl;cout b.A::a endl;system(pause);return0;}输出104记得这里是在类外访问而a在基类中是public所以继承方式应该为public使得a在派生类中仍然为public在类外可以访问。