目录
1.封装
1.1封装的意义一--将属性和行为作为一个整体
1.1.1成员属性,成员变量,成员函数,成员方法
1.2封装的意义二--将属性和行为加以控制,公共权限,保护权限,私有权限
1.3struct和class区别
1.4成员属性设置为私有的优点
1.4.1可以自己控制读写权限
1.4.2对于写可以检测数据的有效性
1.5案例练习
1.5.1练习1--设计立方体
1.5.2练习二--点和圆的关系
1.5.2.1在类中可以让另一个类作为本类的成员
1.5.2.2如何把一个类拆到不同的文件中.h,.cpp
1.封装
1.1封装的意义一--将属性和行为作为一个整体
#include<iostream>
using namespace std;
const double PI = 3.14;
//设计圆类,求圆的周长
//圆求周长的公式:2*PI*半径
//class达标设计一个类,类后面紧跟着的就是类名
class Circle
{
//访问权限
//公共权限,不管是在类内还是类外都可以访问
public:
//属性,通常是一些变量
int m_r;//半径
//行为,在代码中通常用函数去代表它
//获取圆的周长
double calculateZC()
{
return 2 * PI * m_r;
}
};
int main()
{
//通过圆类 创建具体的圆,具体的圆我们称为对象
//实例化(通过一个类 创建一个对象的过程称为实例化)
Circle c1;
//给圆对象的属性进行赋值
c1.m_r = 10;
cout << "圆的周长为:" << c1.calculateZC() << endl;
//将半径和求周长封装在一起
system("pause");//按任意键继续
return 0;
}
1.1.1成员属性,成员变量,成员函数,成员方法
#include<iostream>
using namespace std;
const double PI = 3.14;
//设计学生类
class Student
{
//类中的属性和行为 我们统一称为 成员
//属性也称为成员属性,成员变量
//行为也称为成员函数 成员方法
//公共权限
public:
//属性,通常是一些变量
string name;
int number;
//行为,在代码中通常用函数去代表它
//显示姓名和学号
void showStudent()
{
cout <<"姓名:"<< name << " "
<<"学号:"<< number << endl;
}
//可以通过行为给属性赋值
//给姓名赋值
void setName(string m_name)
{
name = m_name;
}
//给学号赋值
void setNumber(int m_number)
{
number = m_number;
}
};
int main()
{
//创建一个具体学生 实例化(通过一个类 创建对象的过程)对象
Student s;
//给s对象 进行属性赋值操作
s.name = "张三";
s.number = 201640;
s.showStudent();
Student s1;
s1.setName("李四");
s1.setNumber(2017022);
s1.showStudent();
system("pause");//按任意键继续
return 0;
}
1.2封装的意义二--将属性和行为加以控制,公共权限,保护权限,私有权限
#include<iostream>
using namespace std;
//访问权限
//公共权限 public 成员类内可以访问,类外也可以访问
//保护权限 protected 成员类内可以访问,类外不可以访问 儿子可以访问父亲中的保护内容
//私有权限 private 成员类内可以访问,类外不可以访问 儿子不可以访问父亲中的私有内容
class person
{
//公共权限
public:
string m_Name;//姓名
//保护权限
protected:
string m_Car;//汽车
//私有权限
private:
int m_Password;//银行卡密码
private:
void func()
{
m_Name = "张三";
m_Car = "拖拉机";
m_Password = 123456;
}
};
int main()
{
//实例化具体对象
person p1;
p1.m_Name = "李四";
//p1.m_car = "奔驰";//保护权限的内容,在类外访问不到
//p1.m_Password = 123;//私有权限的内容,在类外访问不到
//p1.func();私有权限的内容,在类外访问不到
system("pause");//按任意键继续
return 0;
}
1.3struct和class区别
#include<iostream>
using namespace std;
class C1
{
//默认权限就是public啥的都没写
int m_A;//默认权限是私有
};
struct C2
{
int m_A;//默认权限 是公告
};
int main()
{
//struct和class的区别
//struct 默认权限是 公共 public
//class 默认权限是 私有 private
C1 c1;
//c1.m_A = 100;//报错
C2 c2;
c2.m_A = 100;//在struct中默认权限为公共,可以访问
system("pause");//按任意键继续
return 0;
}
1.4成员属性设置为私有的优点
1.4.1可以自己控制读写权限
#include<iostream>
using namespace std;
//成员属性设置为私有
//1、可以控制读写权限
//2、对于写可以检测数据的有效性
class Person
{
public:
//设置姓名
void setName(string name)
{
m_Name = name;//对外提供一个公共的成员函数,来侧面给它的成员属性进行赋值操作
}
//获取姓名
string getName()
{
return m_Name;
}
//获取年龄,只读
int getAge()
{
m_Age = 0;//初始化为0岁
return m_Age;
}
//设置情人 只写
void setLover(string lover)
{
m_Lover = lover;
}
private:
//姓名 可读可写
string m_Name;
//年龄 只读
int m_Age;
//情人 只写
string m_Lover;
};
int main()
{
Person p;
p.setName("张三");
cout << "姓名为:" << p.getName() << endl;
//p.m_Age = 18;//只读
//p.setAge(18);//只读
cout << "年龄为:" << p.getAge() << endl;
//设置情人为苍井女士
p.setLover("苍井");
//cout << "情人为:" << p.m_Lover << endl;
//cout << "情人为:" << p.getLover() << endl;
system("pause");//按任意键继续
return 0;
}
1.4.2对于写可以检测数据的有效性
#include<iostream>
using namespace std;
//成员属性设置为私有
//1、可以控制读写权限
//2、对于写可以检测数据的有效性
class Person
{
public:
//设置姓名
void setName(string name)
{
m_Name = name;//对外提供一个公共的成员函数,来侧面给它的成员属性进行赋值操作
}
//获取姓名
string getName()
{
return m_Name;
}
//获取年龄,可读可写,如果想修改(年龄的范围必须是0-150之间)
int getAge()
{
return m_Age;
}
//设置年龄
void setAge(int age)
{
if (age < 0 || age>150)
{
cout << "年龄有误" << endl;
m_Age = 0;
}
else
{
m_Age = age;
}
/*还可以这样写
if (age < 0 || age>150)
{
cout << "年龄有误" << endl;
m_Age = 0;
return;
}
m_Age = age;
*/
}
//设置情人 只写
void setLover(string lover)
{
m_Lover = lover;
}
private:
//姓名 可读可写
string m_Name;
//年龄 只读
int m_Age;
//情人 只写
string m_Lover;
};
int main()
{
Person p;
p.setName("张三");
cout << "姓名为:" << p.getName() << endl;
p.setAge(18);
cout << "年龄为:" << p.getAge() << endl;
//设置情人为苍井女士
p.setLover("苍井");
//cout << "情人为:" << p.m_Lover << endl;
//cout << "情人为:" << p.getLover() << endl;
system("pause");//按任意键继续
return 0;
}
1.5案例练习
1.5.1练习1--设计立方体
#include<iostream>
using namespace std;
//立方体类
class Cube
{
public:
void setL(double l)//设置长
{
m_L = l;
}
double getL()//获取长
{
return m_L ;
}
void setW(double w)
{
m_W = w;
}
double getW()
{
return m_W;
}
void setH(double h)
{
m_H = h;
}
double getH()
{
return m_H;
}
double getS()//返回面积
{
return 2 * m_L * m_W + 2 * m_L * m_H + 2 * m_H * m_W;
}
double getV()//返回面积
{
return m_L * m_W * m_H;
}
//利用成员函数判断是否相等
/*void judge(double l, double w, double h)
{
if (m_L == l && m_W == w && m_H == h)
{
cout << "相等" << endl;
}
else
{
cout << "不相等" << endl;
}
}*/
bool isSamebyClass(Cube &c)//成员函数传一个就好,会用已知到去调用这个函数,传入一个未知的
{
if (m_L == c.getL() && m_W == c.getW() && m_H == c.getH())
{
return true;
}
return false;
}
private:
double m_L, m_W, m_H;
};
//利用全局函数判断是否相等
/*void Qjudge(double a1, double a2, double a3, double b1, double b2, double b3)
{
if (a1 == b1 && a2 == b2 && a3 == b3)
{
cout << "相等" << endl;
}
else
{
cout << "不相等" << endl;
}
}*/
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()
{
//创建立方体对象
Cube c1, c2;
c1.setL(10);
c1.setW(10);
c1.setH(10);
c2.setL(20);
c2.setW(20);
c2.setH(20);
cout << "c1面积" << c1.getS() << endl;
cout << "c1体积:" << c1.getV() << endl;
//利用成员函数判断
//c1.judge(c2.getL(), c2.getW(), c2.getH());
//利用全局函数判断
//Qjudge(c1.getL(), c1.getW(), c1.getH(), c2.getL(), c2.getW(), c2.getH());
//利用全局函数判断
bool ret = isSame(c1, c2);
if (ret)
{
cout << "c1、c2相等" << endl;
}
else
{
cout << "c1、c2不相等" << endl;
}
//利用成员函数判断
bool ret1 = c1.isSamebyClass(c2);
if (ret1)
{
cout << "c1、c2相等" << endl;
}
else
{
cout << "c1、c2不相等" << endl;
}
system("pause");//按任意键继续
return 0;
}
1.5.2练习二--点和圆的关系
1.5.2.1在类中可以让另一个类作为本类的成员
#include<iostream>
using namespace std;
//点类
class Point
{
public:
//设置x
void setX(double x)
{
m_X = x;
}
//获取x
double getX()
{
return m_X;
}
//设置y
void setY(double y)
{
m_Y = y;
}
//获取y
double getY()
{
return m_Y;
}
private:
double m_X;
double m_Y;
};
//圆类
class Circle
{
public:
//设置半径
void setR(double r)
{
m_R = r;
}
//获取半径
double getR()
{
return m_R;
}
//设置圆心
void setC(Point center)
{
m_Center = center;
}
//获取圆心
Point getC()
{
return m_Center;
}
private:
double m_R;
//在类中可以让另一个类 作为本类中的成员
Point m_Center;
};
//判断点和圆之间的位置关系
void isInCircle(Circle &c, Point &p)
{
//计算两点之间距离的平方
double distance= (p.getX() - c.getC().getX())* (p.getX() - c.getC().getX())
+ (p.getY() - c.getC().getY()) * (p.getY() - c.getC().getY());
//计算半径的平方
double rDistance= c.getR() * c.getR();
if (distance == rDistance)
{
cout << "点在圆上" << endl;
}
else if (distance > rDistance)
{
cout << "点在圆外" << endl;
}
else
{
cout << "点在圆内" << endl;
}
}
int main()
{
//创建圆
Circle c;
c.setR(10);
Point cp;
cp.setX(10);
cp.setY(0);
c.setC(cp);
//创建点
Point p1,p2,p3;
p1.setX(10);
p1.setY(9);
p2.setX(10);
p2.setY(10);
p3.setX(10);
p3.setY(11);
isInCircle(c, p1);
isInCircle(c, p2);
isInCircle(c, p3);
system("pause");//按任意键继续
return 0;
}
1.5.2.2如何把一个类拆到不同的文件中.h,.cpp
/*point.h代码
#pragma once//防止头文件重复包含
//在头文件中声明
#include<iostream>
using namespace std;
//把成员函数和属性声明
class Point
{
public:
void setX(double x);
//获取x
double getX();
//设置y
void setY(double y);
//获取y
double getY();
private:
double m_X;
double m_Y;
};
*/
/*c.h代码
#pragma once//防止头文件重复包含
#include<iostream>
using namespace std;
#include"point.h"
class Circle
{
public:
//设置半径
void setR(double r);
//获取半径
double getR();
//设置圆心
void setC(Point center);
//获取圆心
Point getC();//将point头文件加进来,让它知道有这么一个类
private:
double m_R;
//在类中可以让另一个类 作为本类中的成员
Point m_Center;
};
*/
/*circle.cpp代码
#include"c.h"
//在头文件中写声明,在cpp中写实现
//设置半径
void Circle::setR(double r)
{
m_R = r;
}
//获取半径
double Circle::getR()
{
return m_R;
}
//设置圆心
void Circle::setC(Point center)
{
m_Center = center;
}
//获取圆心
Point Circle::getC()
{
return m_Center;
}
*/
/*P.cpp代码
#include"point.h"
//只需要留函数的所有实现
//如果只写setX他是全局函数,
// 但我们知道它是一个成员函数
// 需要告诉他是哪个作用域下的
//设置x
void Point::setX(double x)//Point作用域下的成员函数
{
m_X = x;
}
//获取x
double Point::getX()
{
return m_X;
}
//设置y
void Point::setY(double y)
{
m_Y = y;
}
//获取y
double Point::getY()
{
return m_Y;
}
*/
#include<iostream>
using namespace std;
#include"point.h"
#include"c.h"
//判断点和圆之间的位置关系
void isInCircle(Circle &c, Point &p)
{
//计算两点之间距离的平方
double distance= (p.getX() - c.getC().getX())* (p.getX() - c.getC().getX())
+ (p.getY() - c.getC().getY()) * (p.getY() - c.getC().getY());
//计算半径的平方
double rDistance= c.getR() * c.getR();
if (distance == rDistance)
{
cout << "点在圆上" << endl;
}
else if (distance > rDistance)
{
cout << "点在圆外" << endl;
}
else
{
cout << "点在圆内" << endl;
}
}
int main()
{
//创建圆
Circle c;
c.setR(10);
Point cp;
cp.setX(10);
cp.setY(0);
c.setC(cp);
//创建点
Point p1,p2,p3;
p1.setX(10);
p1.setY(9);
p2.setX(10);
p2.setY(10);
p3.setX(10);
p3.setY(11);
isInCircle(c, p1);
isInCircle(c, p2);
isInCircle(c, p3);
system("pause");//按任意键继续
return 0;
}