类和对象介绍
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;
}