page contents

C++新手入门,类成员的访问权限以及类的封装

C++通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限,它们分别表示...

我们在定义类时多次使用到了 public 关键字,表示类的成员具有“公开”的访问权限,这篇我们就来详细讲解。

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

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

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

在类的外部(定义类的代码之外),只能通过对象访问成员,并且通过对象只能访问 public 属性的成员,不能访问 private、protected 属性的成员。本篇重点讲解 public 和 private,protected 将在继承中讲解。下面通过一个 Student 类来演示成员的访问权限:



  1. #include <iostream>

  2. using namespace std;

  3. //类的声明

  4. class Student{

  5. private:  //私有的

  6. char *m_name;

  7. int m_age;

  8. float m_score;

  9. public:  //共有的

  10. void setname(char *name);

  11. void setage(int age);

  12. void setscore(float score);

  13. void show();

  14. };

  15. //成员函数的定义

  16. void Student::setname(char *name){

  17. m_name = name;

  18. }

  19. void Student::setage(int age){

  20. m_age = age;

  21. }

  22. void Student::setscore(float score){

  23. m_score = score;

  24. }

  25. void Student::show(){

  26. cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;

  27. }

  28. int main(){

  29. //在栈上创建对象

  30. Student stu;

  31. stu.setname("小明");

  32. stu.setage(15);

  33. stu.setscore(92.5f);

  34. stu.show();

  35. //在堆上创建对象

  36. Student *pstu = new Student;

  37. pstu -> setname("李华");

  38. pstu -> setage(16);

  39. pstu -> setscore(96);

  40. pstu -> show();

  41. return 0;

  42. }

运行结果:
小明的年龄是15,成绩是92.5
李华的年龄是16,成绩是96
attachments-2021-03-PUXLItff605dbbf8c1d38.jpg
类的声明和成员函数的定义都是类定义的一部分,在实际开发中,我们通常将类的声明放在头文件中,而将成员函数的定义放在源文件中。

类中的成员变量 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赋值。attachments-2021-03-p0Pzu9Kk605dbc054a404.jpg


因为三个成员变量都是私有的,不能通过对象直接访问,所以必须借助三个 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();

attachments-2021-03-yF289THp605dbc11eb327.jpg

简单地谈类的封装

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

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

另外还有一个关键字 protected,声明为 protected 的成员在类外也不能通过对象访问,但是在它的派生类内部可以访问,这点我们将在后续章节中介绍,现在你只需要知道 protected 属性的成员在类外无法访问即可。

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

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

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

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

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

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

attachments-2021-03-9HmKCDkb605dbc25ecd70.jpg

对private和public的更多说明

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

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

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

纯文本复制


  1. class Student{

  2. private:

  3. char *m_name;

  4. private:

  5. int m_age;

  6. float m_score;

  7. public:

  8. void setname(char *name);

  9. void setage(int age);

  10. public:

  11. void setscore(float score);

  12. void show();

  13. };

attachments-2021-03-kNigSifO605dbc388c5a6.jpg

  • 发表于 2021-03-26 18:57
  • 阅读 ( 1003 )
  • 分类:C/C++开发

0 条评论

请先 登录 后评论
小柒
小柒

1470 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章