目录
类和对象
类和对象的概念
C++面向对象的三大特性
一、封装
封装案例1:设计一个学生类,可以给姓名和学号赋值,可以显示学生的姓名和学号。
二、访问权限
访问权限有三种
struct和class的区别
三、成员属性私有化
成员属性私有化的优点:
四、封装案例
案例1:设计立方体类
案例2:点和圆的关系
面向对象编程(OOP)是现代编程的基石之一。C++是一种支持OOP的语言,允许你创建类(Class)和对象(Object)。
类是对对象的抽象。类是一种抽象的数据类型。它们的关系是,对象是类的实例,类是对象的模板。对象是通过new className产生的,用来调用类的方法;类的构造方法 。
类的意义:
2-1.类是把属性和方法进行封装,同时对类的属性和方法进行访问控制。
2-2.类是由我们根据客观事物抽象而成,形成一类事物,然后用类去定义对象,形成这类事物的具体个体。
2-3.类是一个数据类型,类是抽象的,而对象是一个具体的变量,是占用内存空间的。
类的访问控制
在C++中可以对类的属性和方法定义访问级别,public修饰的属性和方法,可以在类的内部访问,也可以在类的外部进行访问。private修饰的属性和方法,只能在类的内部进行访问。
行为
所有对象公有操作即成员函数(通常习惯为public属性)属性:所有对象公有特性即数据成员(通常习惯为protected属性)C++面向对象的三大特性为:封装,继承,多态。
封装目的是实现代码模块化,继承目的是实现代码扩展,静态多态的目的是函数重载和泛型编程,动态多态的目的是虚函数重写。
C++认为万事皆为对象,对象上有其属性和行为
例如:
人可以作为对象,属性有姓名、年龄、身高、体重...,行为有走、跑、跳、吃饭、唱歌…
车也可以作为对象,属性有轮胎、方向盘、车灯...行为有载人、放音乐、放空调...
具有相同性质的对象,我们 可以抽象称为类,人属于人类,车属于车类
封装是C++面向对象的三大特性之一,封装就是将数据和行为有机结合起来,形成一个整体。把数据和处理数据的操作结合形成类,数据和函数都是类的成员。
1.封装的意义:
2.语法:
class 类名{访问权限:属性/行为}
示例:通过一个圆类中的行为得到圆的周长
#include
#include
using namespace std;
// 圆周率
const double PI = 3.14;
// 设计一个圆类 求圆的周长
// class(一个类) 类名
// class代表设计一个类,类后面紧跟着的就是类的名称
class circle {
// 访问权限
// 公共权限
public:
// 属性
// 半径
int r;
//行为:一般为函数
// 获取周长
double calculateZC()
{
return 2 * PI * r;
}
};
int main()
{
// 通过圆类创建具体的圆(对象)
// 实例化 ( 通过一个类 创建一个对象的过程 )
circle c1;
// 给圆对象 的属性进行赋值
c1.r = 10;
cout << "圆的周长:" << c1.calculateZC() << endl;
return 0;
}
运行结果:
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#include
#include
using namespace std;
// 设计一个学生类,属性有姓名和学号
// 可以给姓名和学号赋值,可以显示学生的姓名和学号
// 设计学生类
class student {
public: // 公共权限
// 类中的属性和行为 我们统一称为 成员
// 属性 成员属性 成员变量
// 行为 成员函数 成员方法
// 属性
string name;
int id;
// 行为
// 显示姓名与学号
void showstu()
{
cout << "姓名: " << name << " 学号: " << id << endl;
}
// 可以通过对象的行为给属性赋值
void setname(string i_name)
{
name = i_name;
}
void setID(int i_id)
{
id=i_id;
}
};
int main()
{
// 创建一个具体的学生
// 实例化对象
class student s1;
// 给s1属性赋值
s1.setname("张三");
s1.id = 01;
s1.showstu();
class student s2;
// 给s2属性赋值
s2.name = "李四";
s2.id = 02;
s2.showstu();
class student s3;
// 通过对象的行为给属性赋值
s3.setname("王五");
s3.setID(03);
s3.showstu();
return 0;
}
运行结果:
类在设计时,可以把属性和行为放在不同的权限下,加以控制。
1. public 公共权限 成员 类内类外都可以访问
2. protected 保护权限 成员 类内可以访问,类外不可以访问(有继承关系,父子关系)
3. private 私有权限 成员 类内可以访问,类外不可以访问(父子关系也不可以访问)
示例:
#include
using namespace std;
class person{
public:
// 公共权限
string name;
protected:
// 保护权限
string car;
private:
// 私有权限
int password;
public:
void fun()
{
name = "张三";
car = "BMW";
password = 123456;
}
// 不管哪种形式在类内都是可以访问的
};
int main ()
{
// 实例化具体的对象
class person p1;
p1.name = "李四";
p1.car = "AMG"; // 保护权限的内容在类外是不能访问的
p1.password = 258258; // 私有权限的内容在类外是不能访问的
return 0;
}
报错显示:
在c++中struct和class唯一的区别就在于默认的访问权限不同
区别:
struct 默认是公共权限
class 默认是私有权限
示例:
#include
using namespace std;
class C1
{
int m_A;// 默认权限 是私有
};
struct C2
{
int m_A;// 默认权限 是公共
};
int main ()
{
class C1 c1;
c1.m_A=1000;
struct C2 c2;
c2.m_A=100;
return 0;
}
报错显示:
1. 将所有成员属性设置为私有,可以自己控制读写权限
2. 对于写权限,可以检测数据的有效性
示例:
#include
#include
using namespace std;
// 设计一个人类
class person{
// 设计一个public 的公共接口
public:
// 设置姓名
void set_name(string in_name)
{
name = in_name;
}
// 获取姓名
string get_name()
{
return name;
}
// 设置年龄
void set_age(int in_age)
{
if(in_age<=0||in_age>150){
cout<<"你输入的年龄有误!"<
运行结果:
设计立方体类(Cube)
求出立方体的面积和体积
分别用全局函数和成员函数判断两个立方体是否相等。
示例:
#include
#include
using namespace std;
/*
1.创建立方体类
2.设计属性
3.设计行为 获取立方体面积和体积
4.分别利用全局函数和成员函数 判断两个立方体是否相等
*/
// 立方体类
class Cube{
public:
void setL(int L)
{
m_L=L;
}
int getL()
{
return m_L;
}
void setW(int W)
{
m_W=W;
}
int getW()
{
return m_W;
}
void setH(int H)
{
m_H=H;
}
int getH()
{
return m_H;
}
// 获取立方体的面积
int calculateS()
{
return 2*(m_L*m_W+m_W*m_H+m_L*m_H);
}
// 获取立方体的体积
int calculateV()
{
return m_L*m_H*m_W;
}
// 利用成员函数判断两个立方体是否相等
bool isSameByClass(Cube &C)
{
if(m_L==C.getL()&&m_W==C.getW()&&m_H==C.getH()){
return true;
}
return false;
}
private:
int m_L;// 长
int m_W;// 宽
int m_H;// 高
};
// 利用全局函数判断 两个立方体是否相等
bool isSame(Cube &C1,Cube &C2)
{
if(C1.getL()==C2.getL()&&C1.getW()==C2.getW()&&C1.getH()==C2.getH()){
return true;
}
return false;
}
int main()
{
// 创建一个立方体对象
class Cube C1;
C1.setL(10);
C1.setW(10);
C1.setH(10);
cout<<"C1的面积为:"<
运行结果:
设计一个圆形类(Circle),和一个点类(Point),计算点和圆的关系。
示例:
#include
#include
#include
using namespace std;
// 判断点和圆的关系
/*
点到圆心的距离== 半径 点在圆上
点到圆心的距离 > 半径 点在圆外
点到圆心的距离 < 半径 点在圆内
*/
class Point
{
public:
void setX(int X)
{
m_X=X;
}
int getX()
{
return m_X;
}
void setY(int Y)
{
m_Y=Y;
}
int getY()
{
return m_Y;
}
private:
int m_X;
int m_Y;
};
class Circle
{
public:
// 设置半径
void setR(int R)
{
m_R=R;
}
int getR()
{
return m_R;
}
// 设置圆心
void setCenter(Point center)
{
m_Center=center;
}
Point getCenter()
{
return m_Center;
}
private:
int m_R; // 半径
class Point m_Center;
};
// 判断点和圆的关系
void isInCircle(Circle &c,Point &p)
{
// 计算两点间距离
int distance=pow((pow(c.getCenter().getX()-p.getX(),2))+(pow(c.getCenter().getY()- p.getY(),2)),0.5);
if(distance==c.getR()){
cout<<"点在圆上"< c.getR()){
cout<<"点在圆外"<
运行结果: