C++中public、protected及private用法
转自:http://www.jb51.net/article/54224.htm
初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂。今天本文就来十分分析一下C++中public、protected及private用法。相信对于大家深入掌握C++程序设计会有很大的帮助。
这里我们首先要明白下面几点。
1.类的一个特征就是封装,public和private作用就是实现这一目的。所以:
用户代码(类外)可以访问public成员而不能访问private成员;private成员只能由类成员(类内)和友元访问。
2.类的另一个特征就是继承,protected的作用就是实现这一目的。所以:
protected成员可以被派生类对象访问,不能被用户代码(类外)访问。
现来看看如下示例:
#include<iostream> #include<assert.h> using namespace std; class A{ public:int a;A(){a1 = 1;a2 = 2;a3 = 3;a = 4;}void fun(){cout << a << endl; //正确cout << a1 << endl; //正确cout << a2 << endl; //正确,类内访问cout << a3 << endl; //正确,类内访问 } public:int a1; protected:int a2; private:int a3; }; int main(){A itema;itema.a = 10; //正确itema.a1 = 20; //正确itema.a2 = 30; //错误,类外不能访问protected成员itema.a3 = 40; //错误,类外不能访问private成员system("pause");return 0; }
继承中的特点:
先记住:不管是否继承,上面的规则永远适用!
有public, protected, private三种继承方式,它们相应地改变了基类成员的访问属性。
1.public继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变成:public, protected, private
2.protected继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变成:protected, protected, private
3.private继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变成:private, private, private
但无论哪种继承方式,上面两点都没有改变:
1.private成员只能被本类成员(类内)和友元访问,不能被派生类访问;
2.protected成员可以被派生类访问。
再来看看以下代码:
1.public继承
代码如下:
#include<iostream> #include<assert.h> using namespace std;class A{ public:int a;A(){a1 = 1;a2 = 2;a3 = 3;a = 4;}void fun(){cout << a << endl; //正确cout << a1 << endl; //正确cout << a2 << endl; //正确cout << a3 << endl; //正确 } public:int a1; protected:int a2; private:int a3; }; class B : public A{ public:int a;B(int i){A();a = i;}void fun(){cout << a << endl; //正确,public成员cout << a1 << endl; //正确,基类的public成员,在派生类中仍是public成员。cout << a2 << endl; //正确,基类的protected成员,在派生类中仍是protected可以被派生类访问。cout << a3 << endl; //错误,基类的private成员不能被派生类访问。 } }; int main(){B b(10);cout << b.a << endl;cout << b.a1 << endl; //正确cout << b.a2 << endl; //错误,类外不能访问protected成员cout << b.a3 << endl; //错误,类外不能访问private成员system("pause");return 0; }
2.protected继承:
代码如下:
#include<iostream> #include<assert.h> using namespace std; class A{ public:int a;A(){a1 = 1;a2 = 2;a3 = 3;a = 4;}void fun(){cout << a << endl; //正确cout << a1 << endl; //正确cout << a2 << endl; //正确cout << a3 << endl; //正确 } public:int a1; protected:int a2; private:int a3; }; class B : protected A{ public:int a;B(int i){A();a = i;}void fun(){cout << a << endl; //正确,public成员。cout << a1 << endl; //正确,基类的public成员,在派生类中变成了protected,可以被派生类访问。cout << a2 << endl; //正确,基类的protected成员,在派生类中还是protected,可以被派生类访问。cout << a3 << endl; //错误,基类的private成员不能被派生类访问。 } }; int main(){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");return 0; }
3.private继承:
代码如下:
#include<iostream> #include<assert.h> using namespace std; class A{ public:int a;A(){a1 = 1;a2 = 2;a3 = 3;a = 4;}void fun(){cout << a << endl; //正确cout << a1 << endl; //正确cout << a2 << endl; //正确cout << a3 << endl; //正确 } public:int a1; protected:int a2; private:int a3; }; class B : private A{ public:int a;B(int i){A();a = i;}void fun(){cout << a << endl; //正确,public成员。cout << a1 << endl; //正确,基类public成员,在派生类中变成了private,可以被派生类访问。cout << a2 << endl; //正确,基类的protected成员,在派生类中变成了private,可以被派生类访问。cout << a3 << endl; //错误,基类的private成员不能被派生类访问。 } }; int main(){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");return 0; }
通过以上的代码都备有较为详尽的注释,读者应该能够理解。仔细看代码中派生类B中定义了和基类同名的成员a,此时基类的a仍然存在,可以验证。
int main(){cout << sizeof(A) << endl;cout << sizeof(B) << endl;system("pause");return 0; }
输出:
16
20
所以派生类包含了基类所有成员以及新增的成员,同名的成员被隐藏起来,调用的时候只会调用派生类中的成员。
如果要调用基类的同名成员,可以用以下方法:
int main(){B b(10);cout << b.a << endl;cout << b.A::a << endl;system("pause");return 0; }
输出:
10
4
记得这里是在类外访问,而a在基类中是public,所以继承方式应该为public,使得a在派生类中仍然为public,在类外可以访问。
C++中public、protected及private用法相关推荐
- 深入理解C++中public、protected及private用法
深入理解C++中public.protected及private用法 这篇文章主要介绍了C++中public.protected及private用法,对于C++面向对象程序设计来说是非常重要的概念,需 ...
- C++:C++中public protected private关键字用法
C++:C++中public protected private关键字用法 笔者这里主要针对C++中public protected private关键字做一个较全面的总结.首先public prot ...
- c语言private用法,深入理解C++中public、protected及private用法
初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂.今天本文就来十分分析一下C++中public.protected及pri ...
- c语言中public 用法,深入理解C++中public、protected及private用法
初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂.今天本文就来十分分析一下C++中public.protected及pri ...
- C++中public protected private的区别
1. 不考虑继承关系时 本类方法使用 外部使用 private 是 否 protected 是 否 public 是 是 2. 有继承关系时 子类方法使用 外部 private 否 否 pro ...
- C++中public protected private关键字
访问权限: public 公共接口 :向外界开放,可通过对象或类名访问 protected 受保护的访问:只向子类开放访问权限 ,不可通过对象访问 private私有 :只有类成员可以访问,外界不可以 ...
- C++中public,protected,private派生类继承问题和访问权限问题
当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定. 1.如果子类从父类继承时使用的继承限定符是public,那么 (1)父类的public成员 ...
- java中public private_java中public、private、protected区别
类中的数据成员和成员函数据具有的访问权限包括:public.private.protect.friendly(包访问权限) 1.public:public表明该数据成员.成员函数是对所有用户开放的,所 ...
- java public_java中public,private,protected和default的区别
类中的数据成员和成员函数据具有的访问权限包括:public.private.protect.default(包访问权限) 作用域 当前类 同一package 子孙类 其他pac ...
最新文章
- 为什么体制内外永远在互相羡慕着?
- SignalR Core尝鲜
- hihocoder #1136 : Professor Q's Software
- Oracle原理:11g中的网络配置
- 【转】GitHub 从单机到联机:玩转 Pull Request
- Django REST framework【学习内容】
- Dubbo(九) dubbo的配置文件加载顺序优先级
- 【Qt】QTableView中嵌入复选框CheckBox 的四种方法总结
- Spring Boot + Activiti 工作流框架搭建
- 基本排序看这篇就够了
- Alexey 大神接棒,YOLOv4 重磅来袭!快来一睹论文真容吧!| 原力计划
- centos 安装 Pip 的方法总结
- Android播播放完SD卡指定文件夹音乐之后,自动播放下一首
- A_A03_001 stc-isp 单片机烧录软件安装与使用
- 有道单词本添加js实现自动阅读单词
- VUE和Element-UI下拉框select实现拼音,中文搜索
- android多个app音量调节问题,「App 音量控制」依每个 App 的使用需求自动调整音量(Android)...
- [MAUI 项目实战] 音乐播放器(一):概述与架构
- hdu2859Phalanx
- Java核心技术卷一 -第五章:装箱和拆箱
热门文章
- python代码编写规范有哪些_Python代码编写规范(适合于小团体,低强度)
- Quartus II 15.0详细安装步骤
- Matlab | Matlab从入门到放弃(12)——基于Matlab的特征值与奇异值分解
- 什么是typora,什么是markdown?利用typora编写markdown文本
- 15年软件开发经验总结
- php简单实例,php实现推荐功能的简单实例
- python中的参数值无法传递_python中关于函数参数值传递的问题
- 第四范式天枢入选毕马威首届“领先消费科技50”榜单
- erlang精要(2)-数制
- 牛客多校三 B Black and white