当前位置: 代码迷 >> 综合 >> C++-Record15—类的封装和访问控制
  详细解决方案

C++-Record15—类的封装和访问控制

热度:56   发布时间:2024-01-26 15:01:35.0

目录

类的封装

类的访问控制

struct和class关键字的区别

总体代码


类的封装

以求圆的面积为例,来演示一下类的封装。

class MyCircle
{
public:double m_r; //属性 成员变量double m_s;public:double getR(){return m_r;}void setR(double r) //成员函数{m_r = r;}double getS(){m_s = 3.14*m_r*m_r;return  m_s;}
protected:
private:
};

类的封装

封装(Encapsulation)

A)封装,是面向对象程序设计最基本的特性。把数据(属性)和函数(操作)合成一个整体,这在计算机世界中是用类与对象实现的。

B)封装,把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

备注:有2层含义(把属性和方法进行封装 对属性和方法进行访问控制)

C++中类的封装

       成员变量,C++中用于表示类属性的变量

       成员函数,C++中用于表示类行为的函数

下面看看封装的威力:

void printCircle01(MyCircle *pC)
{cout<<"r"<<pC->getR()<<endl;cout<<"s"<<pC->getS()<<endl;
}void printCircle02(MyCircle &myc)
{cout<<myc.getS()<<endl;
}void printCircle03(MyCircle myc)
{}
void main_类的封装第一层含有()
{MyCircle c1, c2;c1.setR(10);cout<<"c1 s: "<<c1.getS()<<endl;c1.setR(11);printCircle01(&c1);c2.setR(20);printCircle01(&c2);//引用printCircle02(c2);cout<<"hello...."<<endl;system("pause");
}

不但可以调用类的属性,而且可以掉类的方法,这是因为类封装了成员变量和成员函数,这就比简单的C语言的结构体要好的多。

类的访问控制

访问控制:我可以让想被访问的东西露出来,让不想被访问的东西给隐藏,即公共,私有,保护(类的访问控制关键字)。

注意区分类的内部与外部。在class里面的,为类的内部,在类之外的为外部。

public:  修饰的成员变量和函数 可以在类的内部和类的外部访问。
private:  修饰的成员变量和函数只能在类的内部被访问,不能在类的外部访问。
protected:  修饰的成员变量和函数只能在类的内部被访问,不能在类的外部访问, 但有个特例,即用在继承里面。

class MyAdvCircle
{
private:double m_r2; //没有权限修饰的成员变量 函数 是 默认是私有属性private:double m_r; //属性 成员变量double m_s;  //相当于你的银行卡密码public:double getR()  //你的名字{return m_r;}void setR(double r) //成员函数{m_r = r;}double getS(){m_s = 3.14*m_r*m_r;return  m_s;}
};void main_02()
{MyAdvCircle c1, c2;//c1.m_r = 10;   //无法访问c1.setR(10);system("pause");
}

如果类外部的属性去操作类时,如果类的属性是私有的,就不能达成,如果是公有的,就可以。另外,没有权限修饰的成员变量及函数默认是私有属性的。

struct和class关键字的区别

在用struct定义类时,所有成员的默认属性为public

在用class定义类时,所有成员的默认属性为private

struct AAA
{int a;  //用struct关键字定义的类,不写,默认属性是public的.//class									privatepublic:
protected:
private:
};void main()
{AAA a1;a1.a = 11;system("pause");
}

struct 没有特别声明,默认都是public的。

总体代码

dm01_类的封装.cpp

#include "iostream"using namespace std;//求圆形的面积
//封装有2层含义
//1 把属性和方法进行封装 
//2 对属性和方法进行访问控制//3 类的内部和类的外部//4 类的访问控制关键字
//public:  修饰的成员变量和函数 可以在类的内部和类的外部访问
//private:  修饰的成员变量和函数 只能在类的内部被访问,不能在类的外部访问
//protected:  修饰的成员变量和函数 只能在类的内部被访问,不能在类的外部访问, 用在继承里面class MyCircle
{
public:double m_r; //属性 成员变量double m_s;public:double getR(){return m_r;}void setR(double r) //成员函数{m_r = r;}double getS(){m_s = 3.14*m_r*m_r;return  m_s;}
protected:
private:
};//类的封装的威力
//类封装的成员变量和成员函数  //可以调用类的成员函数
void printCircle01(MyCircle *pC)
{cout<<"r"<<pC->getR()<<endl;cout<<"s"<<pC->getS()<<endl;
}void printCircle02(MyCircle &myc)
{cout<<myc.getS()<<endl;
}void printCircle03(MyCircle myc)
{}
void main_类的封装第一层含有()
{MyCircle c1, c2;c1.setR(10);cout<<"c1 s: "<<c1.getS()<<endl;c1.setR(11);printCircle01(&c1);c2.setR(20);printCircle01(&c2);//引用printCircle02(c2);cout<<"hello...."<<endl;system("pause");
}class MyAdvCircle
{
private:double m_r2; //没有权限修饰的成员变量 函数 是 默认是私有属性private:double m_r; //属性 成员变量double m_s;  //相当于你的银行卡密码public:double getR()  //你的名字{return m_r;}void setR(double r) //成员函数{m_r = r;}double getS(){m_s = 3.14*m_r*m_r;return  m_s;}
};void main_02()
{MyAdvCircle c1, c2;//c1.m_r = 10; c1.setR(10);system("pause");
}struct AAA
{int a;  //用struct关键字定义的类,不写,默认属性是public的.//class									privatepublic:
protected:
private:
};void main()
{AAA a1;a1.a = 11;system("pause");
}