前言
人生如逆旅,我亦是行人。
一、类成员的访问权限
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;
}
类的声明和成员函数的定义都是类定义的一部分,在实际开发中,我们通常将类的声明放在头文件中,而将成员函数的定义放在源文件中。
类中的成员变量 m_name、m_age 和m_ score 被设置成 private 属性,在类的外部不能通过对象访问。也就是说,私有成员变量和成员函数只能在类内部使用,在类外都是无效的。
成员函数 setname()、setage() 和 setscore() 被设置为 public 属性,是公有的,可以通过对象访问。
约定:
成员变量大都以m_开头,这是约定成俗的写法,不是语法规定的内容。以m_开头既可以一眼看出这是成员变量,又可以和成员函数中的形参名字区分开。 |
- 因为 三个成员变量都是私有的 ,不能通过对象直接访问,所以必须借助三个
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
的成员 在类外也不能通过对象访问,但是 在它的派生类内部可以访问。