C++--day04
目录:
1. C的提高 1-131P 时间七天
2. C++的基础 132-286P 时间八天
3. C++的提高 287-378P 时间五天
4. C/C++的数据结构 379-482P 时间五天
5. C/C++的设计模式基础 483-540P 时间三天
视频资料:https://www.bilibili.com/video/av27904891?from=search&seid=10891514449061956870
P160 章小结
C++语言对C语言扩充和增强的几点具体体现
P161 C++学习路线和学习标准
面向抽象类(接口)编程
P162 类的封装和访问控制
类和对象
基本概念
1)类、对象、成员变量、成员函数
2)面向对象三大概念
封装、继承、多态
3)编程实践
类的定义和对象的定义,对象的使用
求圆形的面积
类的封装
1)封装(Encapsulation)
A)封装,是面向对象程序设计最基本的特性。把数据(属性)和函数(操作)合成一个整体,这在计算机世界中是用类与对象实现的。
B)封装,把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
备注:有2层含义(把属性和方法进行封装 对属性和方法进行访问控制)
C++中类的封装
成员变量,C++中用于表示类属性的变量
成员函数,C++中用于表示类行为的函数
2)类成员的访问控制
在C++中可以给成员变量和成员函数定义访问级别
Public修饰成员变量和成员函数可以在类的内部和类的外部被访问
Private修饰成员变量和成员函数只能在类的内部被访问
#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<<"r:"<<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(12); PrintCircle02(c2); cout<<"hello..."<<endl; system("pause"); } class MyAdvCircle { 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() { MyAdvCircle c1; //c1.m_r=10;//私有属性不能再外部进行调用 c1.SetR(12); system("pause"); }
P163 struct和class关键字的区别
struct AAA { int a;//用struct关键字定义的类,不写默认属性是public // class private public: protected: private: }; void main() { AAA a1; a1.a=11; system("pause"); }
P164 类的声明和类的实现分开
添加类
P165 面向过程向面向对象转变案例1
//案例1 //设计立方体类(cube),求出立方体的面积和体积 //求两个立方体,是否相等(全局函数和成员函数) #include <iostream> using namespace std; class Cube { public: void setABC(int a=0,int b=0,int c=0) { m_a=a; m_b=b; m_c=c; } int getA() { return m_a; } int getB() { return m_b; } int getC() { return m_c; } public: int getV() { m_v=m_a*m_b*m_c; return m_v; } int getS() { m_s=(m_a*m_b+m_a*m_c+m_b*m_c)*2; return m_s; } int judge(Cube &v1,Cube &v2) { if ((v1.getA()==v2.getA()) &&(v1.getB()==v2.getB())&&(v1.getC()==v2.getC()) ) { return 1; } else { return 0; } } int judge(Cube &v2)//成员函数 函数重载 { //好多人分不清这个场景下的m_a是属于v1的还是v2的 if((m_a==v2.getA()) &&(m_b==v2.getB())&&(m_c==v2.getC())) { return 1; } else { return 0; } } protected: private: int m_a; int m_b; int m_c; int m_v; int m_s; }; //全局函数法 PK 成员函数 //1 表示相等 0表示不相等 int judge(Cube &v1,Cube &v2) { if ((v1.getA()==v2.getA()) &&(v1.getB()==v2.getB())&&(v1.getC()==v2.getC()) ) { return 1; } else { return 0; } } void main() { Cube v1,v2; v1.setABC(2,3,4); cout<<v1.getS()<<endl; cout<<v1.getV()<<endl; // v2.setABC(1,2,3); //问题抛出 冗余 //函数调用意味着:去执行 v1对象的类的成judge v1.judge(v2);//判断v1立方体和v2立方体是否相等 通过类的成员函数 //判断两个立方体体积是否相等 int tag=v1.judge(v1,v2); if (tag==1) { cout<<"相等"<<endl; } else { cout<<"不相等"<<endl; } if (v1.judge(v1,v2)==1) { cout<<"相等"<<endl; } else { cout<<"不相等"<<endl; } system("pause"); } void main01_全局函数调用() { Cube v1,v2; v1.setABC(2,3,4); cout<<v1.getS()<<endl; cout<<v1.getV()<<endl; // v2.setABC(1,2,3); //判断两个立方体体积是否相等 if (judge(v1,v2)==1) { cout<<"相等"<<endl; } else { cout<<"不相等"<<endl; } system("pause"); }
P166 面向过程向面向对象转变案例2
案例2 设计一个圆形类(AdvCircle),和一个点类(Point),计算点在圆内部还是圆外
即:求点和圆的关系(圆内和圆外)
#include <iostream> using namespace std; class MyPoint { public: void setPoin(int _x1,int _y1) { x1=_x1; y1=_y1; } int getX1() { return x1; } int getY1() { return y1; } protected: private: int x1; int y1; }; class AdvCircle { public: void setCircle(int _r,int _x0,int _y0) { r=_r; x0=_x0; y0=_y0; } protected: private: int r; int x0; int y0; public: int judge(MyPoint &myp) { int dd=(myp.getX1()-x0)*(myp.getX1()-x0)+(myp.getY1()-y0)*(myp.getY1()-y0); if (dd<=r*r) { return 1;//在圆形内部 } else { return 0;//点在圆形外部 } } }; void main() { AdvCircle c1; MyPoint p1; c1.setCircle(2,3,3); p1.setPoin(7,7); //在圆形1 不在圆内 0 int tag=c1.judge(p1); if (tag==1) { cout<<"点在圆形内"<<endl; } else { cout<<"点在圆形外"<<endl; } system("pause"); return; }
P167 面向过程向面向对象转变案例3
P168 作业
作业1:编写C++程序完成以下功能:
1)定义一个Point类,其属性包括点的坐标,提供计算两点之间距离的方法;
2)定义一个圆形类,其属性包括圆心和半径;
3)创建两个圆形对象,提示用户输入圆心坐标和半径,判断两个圆是否相交,并输出结果。
#include <iostream> #include <math.h> using namespace std; class Point { public: void getPoint(int x,int y) { p_x=x; p_y=y; } double setPointX() { return p_x; } double setPointY() { return p_y; } private: int p_x; int p_y; public: double Line(Point &y1) { double x; double y; x=p_x-y1.setPointX(); y=p_y-y1.setPointY(); return sqrt(x*x+y*y); } }; class Circle { public: void setKey(int _r,int _x,int _y) { r=_r; p1.getPoint(_x,_y); } double setX() { return x0; } double setY() { return y0; } double setR() { return r; } public: bool isIntersection(Circle &another) { //两个半径之和 int R=r+another.r; //两个圆心之间的距离 double dis=p1.Line(another.p1); if (dis<=R) { return 1; } else { return 0; } } private: int r; int x0; int y0; Point p1; }; int main() { Point p1,p2; int r,x,y; p1.getPoint(1,2); p2.getPoint(3,4); cout<<"两点之间的距离:"<<p1.Line(p2)<<endl; Circle c1,c2; cout << "请输入第一个圆的半径" << endl; cin >> r; cout << "请输入第一个圆的x" << endl; cin >> x; cout << "请输入第一个圆的y" << endl; cin >> y; c1.setKey(r,x, y); cout << "请输入第2个圆的半径" << endl; cin >> r; cout << "请输入第2个圆的x" << endl; cin >> x; cout << "请输入第2个圆的y" << endl; cin >> y; c2.setKey(r,x, y); if (c1.isIntersection(c2) == 1) { cout << "相交" << endl; } else { cout << "不相交" << endl; } system("pause"); }
作业2:设计并测试一个名为Rectangle的矩形类,其属性为矩形的左下角与右上角两个点的坐标,根据坐标能计算出矩形的面积
#include <iostream> #include <math.h> using namespace std; class Box { public: void getPoint(int _x1,int _y1,int _x2,int _y2) { x1=_x1; y1=_y1; x2=_x2; y2=_y2; } double getS() { return (x1-x2)*(y1-y2); } private: int x1; int y1; int x2; int y2; }; void main() { Box B1; B1.getPoint(1,1,2,2); cout<<"这个矩形的面积:"<<B1.getS()<<endl; system("pause"); }
作业3:定义一个Tree类,有成员ages(树龄),成员函数grow(int years)对ages加上years,age()显示tree对象的ages的值。
//定义一个Tree类,有成员ages(树龄),成员函数grow(int years)对ages加上years,age()显示tree对象的ages的值 #include <iostream> using namespace std; class Tree { public: int grow(int year) { ages=ages+year; return ages; } int age() { return ages; } void setage(int x) { ages=x; }