C++类成员的访问权限
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
前面我们在定义类时多次使用到了public 关键字,表示类的成员具有“公开”的访问权限,这节我们就来详细讲解。
C++通过public、protected、private 三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的、受保护的、私有的,被称为成员访问限定符。所谓访问权限,就是你能不能使用该类中的成员。
Java、C# 程序员注意,C++ 中的public、private、protected 只能修
饰类的成员,不能修饰类,C++中的类没有共有私有之分。
在类的内部(定义类的代码内部),无论成员被声明为public、protected 还是private,都是可以互相访问的,没有访问权限的限制。
在类的外部(定义类的代码之外),只能通过对象访问成员,并且通过对象只能访问public 属性的成员,不能访问 private、protected 属性的成员。
本节重点讲解public 和private,protected 将在继承中讲解。
下面通过一个Student 类来演示成员的访问权限:
1.#include
ing namespace std;
3.
4.//类的声明
5.class Student{
6.private://私有的
7.char*m_name;
8.int m_age;
9.float m_score;
10.
11.public://共有的
12.void setname(char*name);
13.void setage(int age);
14.void setscore(float score);
15.void show();
16.};
17.
18.//成员函数的定义
19.void Student::setname(char*name){
20.m_name = name;
21.}
22.void Student::setage(int age){
23.m_age = age;
24.}
25.void Student::setscore(float score){
26.m_score = score;
27.}
28.void Student::show(){
29.cout< 30.} 31. 32.int main(){ 33.//在栈上创建对象 34.Student stu; 35.stu.setname("小明"); 36.stu.setage(15); 37.stu.setscore(92.5f); 38.stu.show(); 39. 40.//在堆上创建对象 41.Student *pstu =new Student; 42.pstu ->setname("李华"); 43.pstu ->setage(16); 44.pstu ->setscore(96); 45.pstu ->show(); 46. 47.return0; 48.} 运行结果: 小明的年龄是15,成绩是92.5 李华的年龄是16,成绩是96 类的声明和成员函数的定义都是类定义的一部分,在实际开发中,我们通常将类的声明放在头文件中,而将成员函数的定义放在源文件中。 类中的成员变量m_name、m_age 和m_ score 被设置成private 属性,在类的外部不能通过对象访问。也就是说,私有成员变量和成员函数只能在类内部使用,在类外都是无效的。 成员函数setname()、setage() 和setscore() 被设置为public 属性,是公有的,可以通过对象访问。 private 后面的成员都是私有的,直到有public 出现才会变成共有的;public 之后再无其他限定符,所以public 后面的成员都是共有的。 一眼看出这是成员变量,又可以和成员函数中的形参名字区分开。 因为三个成员变量都是私有的,不能通过对象直接访问,所以必须借助三个public 属性的成员函数来修改它们的值。下面的代码是错误的: 1.Student stu; 2.//m_name、m_age、m_score 是私有成员变量,不能在类外部通过对象访问 3.stu.m_name ="小明"; 4.stu.m_age =15; 5.stu.m_score =92.5f; 6.stu.show(); 简单地谈类的封装 private 关键字的作用在于更好地隐藏类的内部实现,该向外暴露的接口(能通过对象访问的成员)都声明为public,不希望外部知道、或者只在类内部使用的、或者对外部没有影响的成员,都建议声明为private。 根据C++软件设计规范,实际项目开发中的成员变量以及只在类内部使用的成员函数(只被成员函数调用的成员函数)都建议声明为private,而只将允许通过对象调用的成员函数声明为public。 另外还有一个关键字protected,声明为protected 的成员在类外也不 能通过对象访问,但是在它的派生类内部可以访问,这点我们将在后续章 节中介绍,现在你只需要知道protected 属性的成员在类外无法访问即 可。 有读者可能会提出疑问,将成员变量都声明为private,如何给它们赋值呢,又如何读取它们的值呢? 我们可以额外添加两个public 属性的成员函数,一个用来设置成员变量的值,一个用来修改成员变量的值。上面的代码中,setname()、setage()、setscore() 函数就用来设置成员变量的值;如果希望获取成员变量的值,可以再添加三个函数getname()、getage()、getscore()。 量的名字。 除了set 函数和get 函数,在创建对象时还可以调用构造函数来初始化各个成员变量,我们将在《C++构造函数》一节中展开讨论。不过构造函数只能给成员变量赋值一次,以后再修改还得借助set 函数。 这种将成员变量声明为private、将部分成员函数声明为public 的做法体现了类的封装性。所谓封装,是指尽量隐藏类的内部实现,只向用户提供有用的成员函数。 有读者可能会说,额外添加set 函数和get 函数多麻烦,直接将成员变量设置为public