当前位置: 代码迷 >> 综合 >> C++类和对象之封装(注意事项,案例分析)
  详细解决方案

C++类和对象之封装(注意事项,案例分析)

热度:3   发布时间:2023-12-03 09:33:59.0

类和对象介绍

C++面向对象的三大特性:封装,继承,多态

C++认为万事万物都可以成为对象,对象有着对象的属性和行为

具有相同性质的对象,我们可以将其抽象为类

封装的意义

意义:

  • 将属性和行为作为整体,表现生活中的事物
  • 将属性和行为加以权限控制

语法:class 类名{ 访问权限 : 属性/行为};

案例需求1:设计一个圆类,求圆的周长

#include<iostream>
using namespace std;
//class代表要设计一个类,类后面紧跟着的就是类的名称
class circle
{//公共权限
public://类的行为//构造函数circle(float r1){r = r1;}float C_circle(){float C;C = 2 * 3.14 * r;return C;}//私有权限
private://类的属性float r;
};
int main()
{cout << "请输入圆的半径" << endl;float a;cin >> a;//创建类的对象,并且通过构造函数进行初始化circle c1(a);//调用公共权限内的行为(函数)float c = c1.C_circle();cout << "周长=" << c << endl;return 0;
}

案例需求2:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示姓名和学号

#include<iostream>
using namespace std;
#include<string>
//学生类
class student
{
public://学号赋值void Set_score(int score){s_score = score;}//姓名赋值void Set_name(string name){s_name = name;}//学号输出void Print_score(){cout << "学生学号" << s_score << endl;}//姓名输出void Print_name(){cout << "学生姓名" << s_name << endl;}
private://属性设置为私有,通过公共接口调用int s_score;string s_name;};
int main()
{student s1;cout << "请输入学生的姓名" << endl;string name;cin >> name;cout << "请输入学生的学号" << endl;int score;cin >> score;s1.Set_name(name);s1.Set_score(score);cout << "该学生信息为" << endl;s1.Print_name();s1.Print_score();return 0;
}

类中的属性和行为,我们统一称为成员

成员属性,成员变量,成员函数,成员方法

访问权限

类在设计的时候,可以把属性和行为放在不同的权限下,加以控制

访问权限有三种:

  • public 公共权限

    成员类内可以访问,成员类外也可以访问

  • private 私有权限

    成员类内可以访问,成员类外不可以访问

  • protected 保护权限

    成员类内可以访问,成员类外不可以访问

保护权限和私有权限

子类可以继承访问父类的保护权限

子类不可以继承访问父类的私有权限

C++中类和结构体的区别

在C++中结构体和类的唯一的区别就在于默认访问权限的不同

结构体的默认权限是公共

类的默认权限是私有

class c1
{int m_A; //默认权限为私有权限
};
struct c2
{int m_A; //默认权限为公共权限
};

一般类的创建方法技巧与规范

将成员属性设置为私有

  • 将所有成员属性设置为私有,可以自己控制读写权限
  • 对于写权限,我们可以检测数据的有效性

通过开放公共接口来操作私有属性

方便设置逻辑进行判断输入是否合理

案例1

需求案例:设计立方体类,求出立方体的面积和体积,分别用全局函数和成员函数判断这俩个立方体是否相等

#include<iostream>
using namespace std;
#include<string>
class cube
{
public://构造函数初始化三个棱长cube(int x, int y, int z){m_x = x;m_y = y;m_z = z;}//计算表面积的成员函数int count_s(){int s;s = m_x * m_y * 2 + m_x * m_z * 2 + m_z * m_y * 2;return s;}//计算体积的成员函数int count_v(){int v;v = m_x * m_y * m_z;return v;}
private:int m_x;int m_y;int m_z;
};
int main()
{cout << "请输入三边长" << endl;int a, b, c;cin >> a >> b >> c;cube c1(a, b, c);int s1 = c1.count_s();int v1 = c1.count_v();cout << s1 << " " << v1 << endl;//函数声明int count_s(int x, int y, int z);int count_v(int x, int y, int z);int s2 = count_s(a, b, c);int v2 = count_v(a, b, c);cout << s2 << " " << v2 << endl;if (s1 == s2 && v1 == v2){cout << "测试成功" << endl;}else{cout << "测试失败" << endl;}return 0;
}
//计算表面积的全局函数
int count_s(int x,int y,int z)
{int s;s = x * y * 2 + x * z * 2 + z * y * 2;return s;
}
//计算体积的全局函数
int count_v(int x, int y, int z)
{int v;v = x * y * z;return v;
}

案例2

设计一个圆类和一个点类,计算点和圆的关系

#include<iostream>
using namespace std;
#include<string>
#include<math.h>
class circle
{
public://构造函数进行初始化circle(int x, int y, int r){c_x = x;c_y = y;c_r = r;}//判断与圆的关系void judge(int p_x,int p_y){int d = sqrt((p_x-c_x)* (p_x - c_x)+ (p_y - c_y)* (p_y - c_y));if (d > c_r){cout << "在圆外" << endl;}else if (d < c_r){cout << "在圆内" << endl;}else{cout << "在圆上" << endl;}}
private://将圆心的坐标和半径放入私有成员属性中int c_x;int c_y;int c_r;
};
class point
{
public://构造函数进行初始化point(int x, int y){p_x = x;p_y = y;}//获取坐标int get_x(){return p_x;}int get_y(){return p_y;}
private:int p_x;int p_y;
};
int main()
{cout << "请输入圆心的坐标和圆的半径" << endl;int x, y, r;cin >> x >> y >> r;circle c1(x, y, r);cout << "请输入点的坐标" << endl;int x1, y1;cin >> x1 >> y1;point p1(x1, y1);c1.judge(p1.get_x(), p1.get_y());return 0;
}
  相关解决方案