一、封装
封装:把变量(属性)和函数(操作)合成一个整体,封装在一个类中,对变量和函数进行访问控制(公有、私有、保护)。
1.访问权限
一.在类的内部(作用域范围内),没有访问权限之分,所有成员可以相互访问。
二.在类的外部(作用域范围外),访问权限才有意义:public、private、protected。
三.在类的外部,只有public修饰的成员才能被访问,在没有涉及继承与派生时,private和protected是同等级的,外部不允许访问。
class 类名{
private: //私有属性,类的外部不能直接访问方法成员
protected: //受保护属性,类的外部不能直接访问方法成员
public: //公有属性,类的外部可以直接访问方法成员
//类的内部没有权限之分,都可以相互访问
//默认情况下class是私有属性,用户可以借助公有的方法间接的操作访问私有数据
};
二、类的空间大小
#include<iostream>
using namespace std;
class test{
private:
int num; //成员数据占类的空间大小
public:
void show_num() //成员函数(方法)不占类的空间大小
{
//定义在类内部的函数是隐式的inline函数
cout<<num<<endl;
}
};
三、类作用域和成员函数
类本身就是一个作用域(类的成员函数定义嵌套在类的作用域之内),编译器分两步处理类:首先编译成员的声明,然后才轮到成员函数体(如果有的话)。因此,成员函数体可以随意使用类中的其他成员而无需在意这些成员出现的次序。
四、在类的外部定义成员函数
像其他函数一样,当我们在类的外部定义成员函数时,成员函数的定义必须与它的声明匹配(返回类型、参数列表和函数名都要与类内部声明函数保持一致)。
如果成员被声明成常量成员函数,那么它的定义也必须在参数列表后明确const属性。同时,类外部定义的成员的名字必须包含它所属的类名:
#include<iostream>
using namespace std;
class Student{
private:
int num;
public:
void showNum() const; //常量成员函数
int setNum(int _num);
};
//类外部定义成员函数,需要使用域运算符
int Student::setNum(int _num)
{
this->num = _num;
return this->num;
}
//类外部定义常量成员函数,必须参数列表后明确指定const属性
void Student::show_num() const
{
cout<<this->num<<endl;
}
常量对象,以及常量对象的引用或指针都只能调用常量成员函数。