深入理解C++中public、protected及private用法

这篇文章主要介绍了C++中public、protected及private用法,对于C++面向对象程序设计来说是非常重要的概念,需要的朋友可以参考下

初学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,在类外可以访问。

转载于:https://www.cnblogs.com/tsingke/p/10052445.html

深入理解C++中public、protected及private用法相关推荐

  1. c语言private用法,深入理解C++中public、protected及private用法

    初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂.今天本文就来十分分析一下C++中public.protected及pri ...

  2. c语言中public 用法,深入理解C++中public、protected及private用法

    初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂.今天本文就来十分分析一下C++中public.protected及pri ...

  3. C++中public、protected及private用法

    转自:http://www.jb51.net/article/54224.htm 初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容 ...

  4. C++中public protected private的区别

    1. 不考虑继承关系时   本类方法使用 外部使用 private 是 否 protected 是 否 public 是 是 2. 有继承关系时   子类方法使用 外部 private 否 否 pro ...

  5. C++:C++中public protected private关键字用法

    C++:C++中public protected private关键字用法 笔者这里主要针对C++中public protected private关键字做一个较全面的总结.首先public prot ...

  6. C++中public protected private关键字

    访问权限: public 公共接口 :向外界开放,可通过对象或类名访问 protected 受保护的访问:只向子类开放访问权限 ,不可通过对象访问 private私有 :只有类成员可以访问,外界不可以 ...

  7. C++中public,protected,private派生类继承问题和访问权限问题

    当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定. 1.如果子类从父类继承时使用的继承限定符是public,那么 (1)父类的public成员 ...

  8. matlab中ode45函数的用法_带你理解Excel中COUNTIF函数的简单用法

    每天5分钟,每天学一点. COUNTIF函数是Excel中最常用的统计函数之一,它的作用主要是用于根据特定条件对数据进行统计.假如,你想统计一下本周总共做了几次健身/瑜伽,或者统计上了几次培训课,那么 ...

  9. 深入理解C# 中 “$” 符号的作用以及用法

    前言:$是c# 6.0 的语言特性,功能类似string.format(),更方便的地方在于不要像format一样使用索引,可以直接使用变量.表达式或者方法的执行. 文章目录 一.C#中`$`的作用 ...

最新文章

  1. 使 IDEA 的 termina l可以使用 Linux 下的终端命令
  2. HDU-2476 String painter 区间DP
  3. linux两个数字正则,正则表达式-Linux readelf显示具有不同数字系...
  4. Python导入标准库和扩展库对象的几种方式
  5. Ruffer Investment共持有略高于3%的比特币敞口
  6. Sams_Teach yourself XXX in XXX days
  7. 技术分析:细说3D投影机技术原理
  8. 群晖7.0搭建discuz论坛
  9. 文曲星猜数字游戏java代码_文曲星猜数字游戏6步算法(含代码)
  10. git reset --soft命令的使用
  11. React Native引用三方库报错underfined is not an object(evaluating 'viewproptypes.style')
  12. Django-Templates模板语法(二)
  13. stc12c5a60s DHT11温湿度传感器
  14. 2022-2028年中国手机结构件行业市场发展规模及市场前景趋势报告
  15. 【AD封装】DC电源接口、音频接口(带3D)
  16. list_del()
  17. 下图无序列表的html标记,ul标签-无序列表
  18. Idea 中出现:运行 Test 时出错。命令行过长。 通过 JAR 清单或通过类路径文件缩短命令行,然后重新运行。
  19. el-checkbox 自定义 复选框【多选框】
  20. w ndows默认截图工具,Windows上有哪些自带的截图功能?快来学习吧!

热门文章

  1. centos 学习日记 文件默认权限:umaks
  2. Nagios插件NDOUtils安装
  3. 这个美国议员候选人想发币,联邦选举委员会还答应了
  4. 如何在C ++中从容器中删除元素
  5. 一群算法_树遍历解释:他们就像一群懒惰的学生,试图欺骗他们的考试
  6. Java怎么定义图片公共路径_【Java】springboot配置图片访问路径
  7. autowired java_Java 基础之Autowired 是否是自动注入
  8. 1030 完美数列(二分解法)
  9. android 系统锁屏音乐播放器,Android实现音乐播放器锁屏页
  10. 百度android 测试平台,集成百度活体检测(Android、iOS)