"程序员大咖,一个分享编程知识的公众号。跟着站长一起学习,每天都有进步。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注「程序员大咖CodePush」,你已然超越了90%的程序员!"


C++通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的、受保护的、私有的,被称为成员访问限定符。所谓访问权限,就是你能不能使用该类中的成员。Java、C# 程序员注意,C++ 中的 public、private、protected 只能修饰类的成员,不能修饰类,C++中的类没有共有私有之分。

在类的内部(定义类的代码内部),无论成员被声明为 public、protected 还是 private,都是可以互相访问的,没有访问权限的限制。

在类的外部(定义类的代码之外),只能通过对象访问成员,并且通过对象只能访问 public 属性的成员,不能访问 private、protected 属性的成员。

本节重点讲解 public 和 private,protected 将在继承中讲解。

下面通过一个 Student 类来演示成员的访问权限:

#include using namespace std;//类的声明class Student{private: //私有的 char *m_name; int m_age; float m_score;public: //共有的 void setname(char *name); void setage(int age); void setscore(float score); void show();};//成员函数的定义void Student::setname(char *name){ m_name = name;}void Student::setage(int age){ m_age = age;}void Student::setscore(float score){ m_score = score;}void Student::show(){ cout< setname("李华"); pstu -> setage(16); pstu -> setscore(96); pstu -> show(); return 0;}

运行结果:

小明的年龄是15,成绩是92.5

李华的年龄是16,成绩是96

类的声明和成员函数的定义都是类定义的一部分,在实际开发中,我们通常将类的声明放在头文件中,而将成员函数的定义放在源文件中。

类中的成员变量 m_name、m_age 和m_ score 被设置成 private 属性,在类的外部不能通过对象访问。也就是说,私有成员变量和成员函数只能在类内部使用,在类外都是无效的。

成员函数 setname()、setage() 和 setscore() 被设置为 public 属性,是公有的,可以通过对象访问。

private 后面的成员都是私有的,直到有 public 出现才会变成共有的;public 之后再无其他限定符,所以 public 后面的成员都是共有的。

成员变量大都以m_开头,这是约定成俗的写法,不是语法规定的内容。以m_开头既可以一眼看出这是成员变量,又可以和成员函数中的形参名字区分开。

以 setname() 为例,如果将成员变量m_name的名字修改为name,那么 setname() 的形参就不能再叫name了,得换成诸如name1、_name这样没有明显含义的名字,否则name=name;这样的语句就是给形参name赋值,而不是给成员变量name赋值。

因为三个成员变量都是私有的,不能通过对象直接访问,所以必须借助三个 public 属性的成员函数来修改它们的值。下面的代码是错误的:

Student stu;//m_name、m_age、m_score 是私有成员变量,不能在类外部通过对象访问stu.m_name = "小明";stu.m_age = 15;stu.m_score = 92.5f;stu.show();

简单地谈类的封装

private 关键字的作用在于更好地隐藏类的内部实现,该向外暴露的接口(能通过对象访问的成员)都声明为 public,不希望外部知道、或者只在类内部使用的、或者对外部没有影响的成员,都建议声明为 private。

根据C++软件设计规范,实际项目开发中的成员变量以及只在类内部使用的成员函数(只被成员函数调用的成员函数)都建议声明为 private,而只将允许通过对象调用的成员函数声明为 public。另外还有一个关键字 protected,声明为 protected 的成员在类外也不能通过对象访问,但是在它的派生类内部可以访问,这点我们将在后续章节中介绍,现在你只需要知道 protected 属性的成员在类外无法访问即可。

有读者可能会提出疑问,将成员变量都声明为 private,如何给它们赋值呢,又如何读取它们的值呢?

我们可以额外添加两个 public 属性的成员函数,一个用来设置成员变量的值,一个用来修改成员变量的值。上面的代码中,setname()、setage()、setscore() 函数就用来设置成员变量的值;如果希望获取成员变量的值,可以再添加三个函数 getname()、getage()、getscore()。

给成员变量赋值的函数通常称为 set 函数,它们的名字通常以set开头,后跟成员变量的名字;读取成员变量的值的函数通常称为 get 函数,它们的名字通常以get开头,后跟成员变量的名字。

除了 set 函数和 get 函数,在创建对象时还可以调用构造函数来初始化各个成员变量,我们将在《C++构造函数》一节中展开讨论。不过构造函数只能给成员变量赋值一次,以后再修改还得借助 set 函数。

这种将成员变量声明为 private、将部分成员函数声明为 public 的做法体现了类的封装性。所谓封装,是指尽量隐藏类的内部实现,只向用户提供有用的成员函数。

有读者可能会说,额外添加 set 函数和 get 函数多麻烦,直接将成员变量设置为 public 多省事!确实,这样做 99.9% 的情况下都不是一种错误,我也不认为这样做有什么不妥;但是,将成员变量设置为 private 是一种软件设计规范,尤其是在大中型项目中,还是请大家尽量遵守这一原则。

为了减少代码量,方便说明问题,本教程中的类可能会将成员变量设置为 public,请读者不要认为这是一种错误。

对private和public的更多说明

声明为 private 的成员和声明为 public 的成员的次序任意,既可以先出现 private 部分,也可以先出现 public 部分。如果既不写 private 也不写 public,就默认为 private。

在一个类体中,private 和 public 可以分别出现多次。每个部分的有效范围到出现另一个访问限定符或类体结束时(最后一个右花括号)为止。但是为了使程序清晰,应该养成这样的习惯,使每一种成员访问限定符在类定义体中只出现一次。

下面的类声明也是完全正确的:

纯文本复制class Student{private: char *m_name;private: int m_age; float m_score;public: void setname(char *name); void setage(int age);public: void setscore(float score); void show();};

小编公众号;程序员大咖(CodePush)回复今日头条还有资源共享哦

c++ 私有内部类_C++类成员的访问权限以及类的封装相关推荐

  1. C++类成员的访问权限以及类的封装

    C++通过 public.protected.private 三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的.受保护的.私有的,被称为成员访问限定符.所谓访问权限,就是你能不能使用该 ...

  2. 在继承中派生类成员的访问权限测试

    派生类对自身基类的private成员没有访问权限,对基类对象的protected成员没有访问权限,对派生类对象的(基类之外)的private和protected成员具有访问权限. 由于C++基础不好, ...

  3. Java——类成员的访问权限修饰符(private、protected、public、default)

    本文转载自:https://blog.csdn.net/qq_41420688/article/details/83348546 1. 作用 封装将数据和操作连接起来.封装的一个重要属性:访问控制. ...

  4. C++ 公有继承、保护继承和私有继承中类成员的访问权限的控制

    很多同学到现在仍然对访问权限不是很清楚,或者比较模糊,有的同学记了又忘,忘了又记,所以今天想要借这篇文章给大家做一些总结,然后提供一个比较简便的方法去记C++中的访问权限. 众所周知,C++通过pub ...

  5. Java成员的访问权限控制

    Java中的访问权限控制包含两个部分: 类的访问权限控制 类成员的访问权限控制 对类来说,访问权限控制修饰符可以是public或者无修饰符(默认的包访问权限): 对于类成员来说,访问权限控制修饰符可以 ...

  6. php 访问类成员,PHP类成员的访问方式和权限_PHP教程

    PHP5的访问方式允许限制对类成员的访问. 这是在PHP5中新增的功能,但在许多面向对象语言中都早已存在. 有了访问方式,才能开发一个可靠的面向对象应用程序,并且构建可重用的面向对象类库. 像C++和 ...

  7. java 类中有几种访问权限_类中成员的访问权限_Java语言程

    类中成员的访问权限_Java语言程 4.7.2 类中成员的访问权限 Java将类中成员(成员变量和成员方法)的访问权限(可见性)划分为4种情况,按照访问权限的范围大小从小到大列出如下. ·私有(pri ...

  8. C# 成员默认访问权限(public、private、protected、internal)

    来源 https://www.cnblogs.com/yezongjie/p/20181121AccessRights.html 1.C#五个修饰符的权限 修饰符 级别 适用成员 解释 public ...

  9. Java内部类、外部类之间访问权限

    Java内部类.外部类之间访问权限 啥是内部类 内部类可以访问外部类的所有成员吗 那外部类能访问内部类的所有成员吗 匿名内部类 静态内部类呢 为啥会这样呢 得出结论 啥是内部类 顾名思义,内部类就是在 ...

最新文章

  1. 0-1背包 一维数组为什么逆序枚举
  2. 算法-打印一个字符串的全部子序列,包括空字符串
  3. 从初创公司的角度来看微服务
  4. linux对于文本的操作,Linux文本文件操作
  5. java算法,发扑克牌
  6. 高考改变命运,来自一个湖南贫困村的真实样本
  7. net core 使用Newtonsoft.Json 读取Json文件数据
  8. 金格HTML签章集成
  9. 微信小程序上传照片到服务器
  10. Python:第三方模块phonenumbers 解析全球电话号码
  11. 计算机的用户和密码在哪里看,电脑b站(哔哩哔哩)怎么查看自己的账号和密码?登录地址在哪找到?...
  12. Shader光照模型-高光反射
  13. IDEA 报错:Information:java: Errors occurred while compiling module ‘项目名‘
  14. VPX-M1 3U VPX 刀片计算机产品
  15. 前端监控SDK开发分享
  16. 写给自己的话:是时候有个计划了,骚年
  17. 【读书笔记】关于《简读中国史》的思考
  18. 我套你猴子的,哥上岸了!附上我的字节客户端开发面经,希望帮助到大家!
  19. 荐在vue中最好用的编辑器 —— vue-json-editor
  20. 【leetcode】43.1~n整数中1出现的次数

热门文章

  1. Install Oracle Instant Client on Linux and Windows
  2. 前端开发工程师如何在新的一年里提升自己
  3. 完成这个例子,说出java中针对异常的处理机制。
  4. JQuery Easy Ui 可装载组合框 - ComboBox
  5. 2013杭电warm up1 hdu 4712 Hamming Distance
  6. nginx proxy_next_upstream导致的一个重复提交错误
  7. 为什么ConcurrentHashMap是弱一致的
  8. java maven 项目依赖管理 简介
  9. linux 安装 celluloid 视频播放器
  10. golang 字符串md5 生成方式