封装在之前的文章中有所涉及,现在将具体的进行学习。
封装的意义
封装将属性和行为作为一个整体,表现生活中的事物,将属性和行为加以权限控制,语法在前面类和对象一节中有大概的体现。
class classname{ public/private...:属性,行为}
属性(成员属性、成员变量)和行为(成员函数、成员方法)被统称为类中的成员。
下面用一个圆类来举例。
#include<iostream>
using namespace std;
class circle{
public:
int r; //圆的属性
double C(){
C = 2 * 3.14 * r ; //计算圆的周长,属于行为,一般来说
return C; //行为使用函数来表示
}
};
int main()
{
circle c1;
c1.r = 10;
cout<<"圆的周长"<<C<<endl;
return 0;
}
实际上类看上去就像一个升级版的结构体,对类的访问还有创建类中的一个新的对象都和结构体很相似。当然,他们之间也有区别,他们之间唯一的区别就是默认的访问权限不同。struct的默认权限为public,class的默认权限为private。
封装也可以将成员放在不同的权限下进行控制。
访问权限有三种:pubilc, private, protected
public权限被称为公共权限,在类内和类外都可以访问
protected权限被称为保护权限,类内可以访问,类外不可以访问,属性可以被继承
private权限被称为私有权限,类内可以访问,类外不可以访问,属性不可以被继承
私有属性的优势在于可以自己控制读写权限,同时在写的时候还可以检验数据的有效性。
#include<iostream>
#include<string>
using namespace std;
class person{
public:
//修改姓名
void setname(string name)
{
m_name = name;
}
//打印姓名
void getname()
{
return m_name;
}
int getage()
{
m_age = 18;
return m_age;
}
void setsecret(string secret)
{
m_secret = secret;
}
private:
string m_name; //可以读取也可以修改
int m_age; //只读
string m_secret; //只写
};
int main()
{
person p1;
p1.setname("John");
cout<<p1.getname()<<endl; //由函数在类内调用传递到类外
cout<<p1.getage()<<endl; //虽然可以读取,但是没有设置写的权限,写入时要进入private权限,因此不能修改
p1.setsecret = ("secret");//在这里将secret传进了函数中,实际上secret已经发生了改变,但是由于只是可写状态,所以并不能读取里面的变化
}
实际上private的思想就是通过是否使用函数成员控制行为来决定外界对private内部的权限,使得这一权限是可以被修改的。因此,public可以被看作是一个接口,用于连接内部的属性。
在类内使用判断语句就可以控制输入的数据是否合法。