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

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

	C++ 中的 public、private、protected 只能修饰类的成员,不能修饰类,C++中的类没有共有私有之分。

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

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

通过 Student 类示例访问权限:

#include <iostream>
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<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;
}int main(){//在栈上创建对象Student stu;stu.setname("小王");stu.setage(15);stu.setscore(92.5f);stu.show();//在堆上创建对象Student *pstu = new Student;pstu -> 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 后面的成员都是共有的。

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

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

类的封装

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

根据C++软件设计规范,实际项目开发中的成员变量以及只在类内部使用的成员函数(只被成员函数调用的成员函数)都建议声明为 private,而只将允许通过对象调用的成员函数声明为 public。

另外还有一个关键字 protected,声明为 protected 的成员在类外也不能通过对象访问,但是在它的派生类内部可以访问。

有的人心里产生了新的疑问,将成员变量都声明为 private,如何给它们赋值呢,又如何读取它们的值呢?

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

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

这种将成员变量声明为 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();
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle数据库12下载地址,Oracle 数据库和补丁下载地址 12.1.0.2 11.2.0.4 11.2.0.1

Oracle 数据库和补丁下载地址 12.1.0.2 11.2.0.4 11.2.0.1 AIX Linux Windows平台AIX 12.1.0.2 DATABASE DB 数据库软件介质下载地址&#xff1a;ftp://104.236.52.210/aix.ppc64_12102_database_1of2.zipftp://104.236.52.210/aix.ppc64_12102_database_2of2.zipAIX 11.2.0.4…

用swing设计一个打地鼠小游戏_这7个风靡欧美的英语小游戏,学会胜过刷100道题!...

精彩导读小编为大家搜罗了一些在国外家喻户晓的语言类小游戏。好的方法胜过刷上100道题&#xff0c;真正让孩子觉得好玩&#xff0c;教学才会事半功倍&#xff01;01Would You Rather...最近牛津大学的面试考题惊天地爆出了一题&#xff1a;你想要变成吸血鬼还是想要变成僵尸&a…

oracle数据库9i安装,Oracle 9i数据库服务器的安装和辅助软件安装教程

安装数据库服务器以Oracle 9i数据库服务器软件的安装过程为例&#xff0c;介绍数据库服务器的安装过程。14.3.1 安装数据库服务器系统环境数据库服务器安装之前&#xff0c;一般都需要检测系统安装环境&#xff0c;以避免系统不支持、内存不够、硬盘空间不足等情况发生。下面从…

python计算排队时间_Python(pdb)-排队执行命令

我正在实现一个“断点”系统以用于我的Python开发,该系统将允许我调用一个实质上调用pdb.set_trace()的函数.我想实现的某些功能要求我在set_trace上下文中时通过代码控制pdb.例&#xff1a;disableList []def breakpoint(nameNone):def d():disableList.append(name)#****#is…

oracle数据库各组件介绍,Oracle 数据库 组件相关说明【第一部分】

参考MOS文档:Information On Installed Database Components and Schemas (文档 ID 472937.1)Oracle 组件可以通过下面的SQL查看&#xff0c;这是我的一个生产库的组件情况&#xff0c;我当时是都部署了&#xff1a;SQL> col COMP_NAME for a50SQL> select comp_id,comp_…

oracle 触发器 行级,oracle的行级触发器使用

行级触发器&#xff1a;当触发器被触发时&#xff0c;要使用被插入、更新或删除的记录中的列值&#xff0c;有时要使用操作前、后列的值.:NEW 修饰符访问操作完成后列的值:OLD 修饰符访问操作完成前列的值例1: 建立一个触发器, 当职工表 emp 表被删除一条记录时&#xff0c;把被…

python include的功能_在Python的Config中增加Include功能

在python中配置文件分析我一般都用configparser。很好&#xff0c;符合我的一贯需求。文本格式、简单、内置。如:[db]hostlocalhostuserdlpasswd12345678[other]因为小程序较多&#xff0c;分别在不同地方&#xff0c;但是都有些共同的配置(如DB的配置)。如果能在配置文件中inc…

oracle的空闲等待事件,Oracle 常见的33个等待事件详解

一&#xff0e; 等待事件的相关知识&#xff1a;1.1 等待事件主要可以分为两类&#xff0c;即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件。1). 空闲等待事件指ORACLE正等待某种工作&#xff0c;在诊断和优化数据库的时候&#xff0c;不用过多注意这部分事件。2). 非空闲等待…

python wechatpay微信支付回调_【微信支付】JSAPI支付开发者文档

XXE漏洞需要您在回调处理代码里面解析XML之前&#xff0c;加入禁用实体解析的代码&#xff0c;不同语言设置的内容不同&#xff0c;下面提供了几种主流开发语言的设置指引(您可以根据关键字找到xml解析组件采取对应方法升级)&#xff1a;【PHP】 解析XML代码前加入&#xff1a;…

如何查看oracle压力,oracle压力测试之orabm

数据库压力测试一、用orabm测试数据库CPUOrabm通过在用户指定的并发下运行指定数量的事务来测试系统性能.它主要测试数据库服务器的CPU性能和内存。orabm实际上是一堆sql的集合。orabm可以用在linux/windows/solaris下使用。orabm不一定需要运行在数据库所在服务器上&#xff0…

C++ static静态成员变量

在C中&#xff0c;我们可以使用静态成员变量来实现多个对象共享数据的目标。静态成员变量是一种特殊的成员变量&#xff0c;它被关键字static修饰&#xff0c;例如&#xff1a; class Student{ public:Student(char *name, int age, float score);void show(); public:static …

oracle河南城建学院实验报告,数据处理实验报告

化工与材料工程学院实验报告《试验设计与数据处理》上机实验报告学 生 学 号 学 生 姓 名 专 业 班 级 指 导 教 师 联合指导教师 完 成 日 期教 授 教 授 2010.5.27.第 1 章 实验一 Excel 基础及有关操作技巧1.1 实验目的熟悉 Excel 基础操作&#xff0c;掌握 Excel 有关操作技…

import lombok 报错_Lombok注解@Getter @Setter详解

1.为什么强大​项目中经常使用bean&#xff0c;entity等类&#xff0c;绝大部分数据类类中都需要get、set、toString、equals和hashCode方法&#xff0c;尽管IDE工具都会帮我们生成。但自动生成这些代码后&#xff0c;如果bean中的属性一旦有修改、删除或增加时&#xff0c;需要…

司铭宇老师:如何让企业销售培训效果落地

如何让企业销售培训效果落地 在企业销售培训中&#xff0c;我们经常听到一个词&#xff0c;那就是“落地”。所谓的“落地”&#xff0c;简单来说就是将培训中所学到的知识和技能转化为实际的工作行动&#xff0c;从而提高销售业绩。但是&#xff0c;如何才能让销售培训效果真…

C++ static静态成员函数

在类中&#xff0c;static 除了可以声明静态成员变量&#xff0c;还可以声明静态成员函数。普通成员函数可以访问所有成员&#xff08;包括成员变量和成员函数&#xff09;&#xff0c;静态成员函数只能访问静态成员。 编译器在编译一个普通成员函数时&#xff0c;会隐式地增加…

php7开发的项目怎么样,如何在PHP7项目中搭建一个多线程

如何在PHP7项目中搭建一个多线程发布时间&#xff1a;2021-03-05 15:31:22来源&#xff1a;亿速云阅读&#xff1a;93作者&#xff1a;Leah这期内容当中小编将会给大家带来有关如何在PHP7项目中搭建一个多线程&#xff0c;文章内容丰富且以专业的角度为大家分析和叙述&#xff…

C++ const成员变量和成员函数

const成员变量 const 成员变量的用法和普通 const 变量的用法相似&#xff0c;只需要在声明时加上 const 关键字。初始化 const 成员变量只有一种方法&#xff0c;就是通过构造函数的初始化列表。 const成员函数&#xff08;常成员函数&#xff09; const 成员函数可以使用类…

通过日志恢复oracle序列,(存档日志包含序列84,要求序列36)怎么恢复啊?

(存档日志包含序列84&#xff0c;要求序列36)怎么恢复啊&#xff1f;SQL> startup mount;ORACLE 例程已启动Total System Global Area 135338868 bytesFixed Size 453492 bytesVariable Size 109051904 bytesDatabase Buffers 251…

C++ const对象

C 中&#xff0c;const 也可以用来修饰对象&#xff0c;称为常对象。一旦将对象定义为常对象之后&#xff0c;就只能调用类的 const 成员&#xff08;包括 const 成员变量和 const 成员函数&#xff09;了。 定义常对象的语法和定义常量的语法类似&#xff1a; const class …

lvs工作在第几层_LVS 原理(调度算法、四种模式、四层负载均衡和七层 的区别)...

目录lvs的调度算法lvs的四种模式四层均衡负载和七层的区别1、lvs调度算法(最常用的四种)轮叫调度(rr)调度器通过外部请求的顺序轮流分配到集群中的真实服务器上&#xff0c;对每台服务器都是均等的&#xff1b;但是这样调度器不会考虑服务器上实际的连接数和系统负载&#xff0…