自学编程网站,遵义建一个网站大概要多少钱,医疗机构 网站备案,熊猫网站pptC通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限#xff0c;它们分别表示公有的、受保护的、私有的#xff0c;被称为成员访问限定符。所谓访问权限#xff0c;就是你能不能使用该类中的成员。 Java、C# 程序员注意#xff0c;C 中的 publ…C通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限它们分别表示公有的、受保护的、私有的被称为成员访问限定符。所谓访问权限就是你能不能使用该类中的成员。 Java、C# 程序员注意C 中的 public、private、protected 只能修饰类的成员不能修饰类C中的类没有共有私有之分。 在类的内部定义类的代码内部无论成员被声明为 public、protected 还是 private都是可以互相访问的没有访问权限的限制。 在类的外部定义类的代码之外只能通过对象访问成员并且通过对象只能访问 public 属性的成员不能访问 private、protected 属性的成员。 本节重点讲解 public 和 privateprotected 将在继承中讲解。 下面通过一个 Student 类来演示成员的访问权限 #include iostreamusing 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(){coutm_name的年龄是m_age成绩是m_scoreendl;}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 后面的成员都是共有的。
成员变量大都以m_开头这是约定成俗的写法不是语法规定的内容。以m_开头既可以一眼看出这是成员变量又可以和成员函数中的形参名字区分开。
以 setname() 为例如果将成员变量m_name的名字修改为name那么 setname() 的形参就不能再叫name了得换成诸如name1、_name这样没有明显含义的名字否则namename;这样的语句就是给形参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();};