• C++杂讲 类 初讲


    目录

    知识点1【知识点引入】

    知识点2【类的初识】

    1、封装

    2、权限

    3、类的定义(定义类型)

    4、类的成员函数 类中声明 类外定义

    知识点3【Person类的设计】

    知识点4【设计立方体类】

    知识点5【点Point和圆Circle的关系】


    知识点1【知识点引入】

    C语言中 数据 和 方法 是独立:

    1. //c语言的思想:数据 方法 分开
    2. //人
    3. typedef struct
    4. {
    5. char name[32];
    6. int age;
    7. }Person;
    8. //动物
    9. typedef struct
    10. {
    11. char name[32];
    12. int age;
    13. int type;
    14. }Dog;
    15. void PersonEat(Person *p)
    16. {
    17. cout<<p->name<<"正在吃饭"<<endl;
    18. }
    19. void DogEat(Dog *d)
    20. {
    21. cout<<d->name<<"正在吃狗粮, 汪汪"<<endl;
    22. }
    23. void test01()
    24. {
    25. Person person = {"老王",43};
    26. Dog dog={"旺财",6};
    27. PersonEat(&person);
    28. DogEat(&dog);
    29. // 出现一个问题(数据 方法独立 容易造成 方法 调用错误数据)
    30. DogEat((Dog *)&person);
    31. }

    知识点2【类的初识】

    1、封装

            把变量(属性)和函数(操作)合成一个整体,封装在一个类中

            对变量和函数进行访问控制(公有、私有、保护)

    类的封装:将数据和方法封装在一起 加以权限区分 用户只能通过公共方法 访问私有数据。

    2、权限

            private私有 public公有 protected保护

    private私有:类外部不可直接访问私有数据 类内部可以访问

    protected保护:类外部不可直接访问私有数据 类内部可以访问

    public公有:类外部可以访问私有数据 类内部可以访问

    权限只是针对 类的外部 , 类的内部 没有权限之分

    1. class 类名{//抽象的概念 系统不会为其分配空间
    2. private://私有 类的外部 不可直接访问
    3. protected://保护 类的外部 不可直接访问
    4. 数据
    5. public://公有 类的外部 可以直接访问
    6. 方法
    7. //在类的内部 没有权限之分 都可以相互访问
    8. };

    案例:

    1. class Person//抽象的概念
    2. {//类的内部
    3. private:
    4. int m_money;//私有数据
    5. protected:
    6. int m_age;
    7. public:
    8. void dese()
    9. {
    10. m_money = 100;
    11. m_age = 18;
    12. cout<<"我有房 有车 又年轻"<<m_age<<"岁又有钱"<<m_money<<"万美金 我就爱嘚瑟"<<endl;
    13. }
    14. };
    15. void test01()
    16. {
    17. //用类 去 实例化 一个对象(就是用Person定义一个变量)
    18. Person lucy;
    19. //cout<<"兄弟你的钱:"<<lucy.m_money<<endl;//err 内的外部不可访问
    20. //cout<<"兄弟你的年龄:"<<lucy.m_age<<endl;//err 内的外部不可访问
    21. lucy.dese();//ok 公有的类的外部可用访问
    22. //private protected虽然是私有、保护的 类外不可访问 但是用户可以借助 public公有的方法
    23. //间接的访问私有、保护的数据
    24. }

    class默认是私有的 数据私有 方法公有 用户就可以借助 公有方法 间接的操作 私有数据

    3、类的定义(定义类型)

     关键字 class

    1. #include <iostream>
    2. using namespace std;
    3. //类的定义:是不占空间 只有用类实例化 对象的时候 系统为对象开辟空间
    4. class Data
    5. {
    6. private://私有
    7. // int a=10;//err 定义类的时候 尽量不要 给成员赋值
    8. int a;//成员 数据
    9. protected://保护
    10. int b;
    11. public://公有
    12. int c;
    13. //成员函数
    14. void data_show(void)
    15. {
    16. //类的内部:没有权限区分
    17. cout<<a<<", "<<b<<", "<<c<<endl;
    18. }
    19. };
    20. //类中的数据成员 拥有 独立的空间
    21. void test01()
    22. {
    23. //使用Data实例化一个对象名为ob的对象
    24. Data ob;
    25. //成员数据依赖于对象的
    26. //cout<<" ob.a = "<<ob.a<<endl;//err a为私有 类外不能直接访问
    27. //cout<<" ob.b = "<<ob.b<<endl;//err b为保护 类外不能直接访问
    28. cout<<" ob.c = "<<ob.c<<endl;//err c为公有 类外可以直接访问
    29. //对象 通过公共方法 间接调用私用数据
    30. ob.data_show();
    31. }
    32. int main(int argc, char *argv[])
    33. {
    34. test01();
    35. return 0;
    36. }

    4、类的成员函数 类中声明 类外定义

    1. class Data2
    2. {
    3. //默认为私有
    4. int a;
    5. public:
    6. //类中声明 类外定义
    7. void setA(int v);
    8. int getA(void);
    9. };
    10. void Data2::setA(int v)
    11. {
    12. a = v;
    13. return;
    14. }
    15. int Data2::getA()
    16. {
    17. return a;
    18. }
    19. void test02()
    20. {
    21. Data2 ob;
    22. ob.setA(100);
    23. cout<<"a = "<<ob.getA()<<endl;
    24. }

     

     

    知识点3【Person类的设计】

    设计一个Person类型

            设计一个Person类,Person类具有name和age属性,提供初始化函数(Init),并提供对name和age的 读写函数(set,get),但必须确保age的赋值在有效范围内(0-100),超出有效范围,则拒绝赋值,并提供 方法输出姓名和年龄。

    person.h:

    1. #ifndef PERSON_H
    2. #define PERSON_H
    3. //类的头文件:一般定义成员数据 声明成员函数
    4. class Person
    5. {
    6. private:
    7. char m_name[32];
    8. int m_age;
    9. public:
    10. //初始化m_name m_age
    11. void init(char *name, int age);
    12. //设置name
    13. void setName(char *name);
    14. //获取name
    15. char *getName(void);
    16. //设置age
    17. void setAge(int age);
    18. //获取age
    19. int getAge(void);
    20. //显示m_name m_age
    21. void showPerons(void);
    22. };
    23. #endif // PERSON_H

     person.cpp:

    1. #include "person.h"
    2. //#include <string.h>
    3. #include<cstring>
    4. #include<iostream>
    5. using namespace std;
    6. //定义类的成员函数
    7. void Person::init(char *name, int age)
    8. {
    9. strcpy(m_name, name);
    10. if(age>=0 && age<=100)
    11. {
    12. m_age = age;
    13. }
    14. else
    15. {
    16. cout<<"年龄输入非法"<<endl;
    17. }
    18. }
    19. void Person::setName(char *name)
    20. {
    21. strcpy(m_name, name);
    22. return;
    23. }
    24. char *Person::getName()
    25. {
    26. return m_name;
    27. }
    28. void Person::setAge(int age)
    29. {
    30. if(age>=0 && age<=100)
    31. {
    32. m_age = age;
    33. }
    34. else
    35. {
    36. cout<<"年龄输入非法"<<endl;
    37. }
    38. return;
    39. }
    40. int Person::getAge()
    41. {
    42. return m_age;
    43. }
    44. void Person::showPerons()
    45. {
    46. cout<<"姓名:"<<m_name<<", 年龄:"<<m_age<<endl;
    47. return;
    48. }

    main.cpp

    1. #include <iostream>
    2. #include "person.h"
    3. using namespace std;
    4. int main(int argc, char *argv[])
    5. {
    6. Person ob;
    7. ob.init("lucy", 18);
    8. ob.showPerons();
    9. ob.setName("bob");
    10. cout<<"姓名:"<<ob.getName()<<endl;
    11. ob.setAge(19);
    12. cout<<"年龄:"<<ob.getAge()<<endl;
    13. return 0;
    14. }

    知识点4【设计立方体类】

            设计立方体类(Cube),求出立方体的面积( 2ab + 2ac + 2bc )和体积( a * b * c),分别用全局函数和成员 函数判断两个立方体是否相等

    cube.h

    1. #ifndef CUBE_H
    2. #define CUBE_H
    3. class Cube
    4. {
    5. private:
    6. int m_l;
    7. int m_w;
    8. int m_h;
    9. public:
    10. void setL(int l);
    11. int getL(void);
    12. void setW(int w);
    13. int getW(void);
    14. void setH(int h);
    15. int getH(void);
    16. int getS(void);
    17. int getV(void);
    18. bool compareCube(Cube &ob);
    19. };
    20. #endif // CUBE_H

    cube.cpp

    1. #include "cube.h"
    2. void Cube::setL(int l)
    3. {
    4. m_l = l;
    5. return;
    6. }
    7. int Cube::getL()
    8. {
    9. return m_l;
    10. }
    11. void Cube::setW(int w)
    12. {
    13. m_w = w;
    14. return;
    15. }
    16. int Cube::getW()
    17. {
    18. return m_w;
    19. }
    20. void Cube::setH(int h)
    21. {
    22. m_h = h;
    23. return;
    24. }
    25. int Cube::getH()
    26. {
    27. return m_h;
    28. }
    29. int Cube::getS()
    30. {
    31. return (m_l*m_w+m_w*m_h+m_l*m_h)*2;
    32. }
    33. int Cube::getV()
    34. {
    35. return m_l*m_w*m_h;
    36. }
    37. bool Cube::compareCube(Cube &ob)
    38. {
    39. if((m_l==ob.m_l) &&( m_w==ob.m_w) &&(m_h == ob.m_h))
    40. return true;
    41. else
    42. return false;
    43. }

    main.cpp

    1. #include <iostream>
    2. #include "cube.h"
    3. using namespace std;
    4. bool myCompareCube(Cube &ob1, Cube &ob2)
    5. {
    6. if((ob1.getL() == ob2.getL()) && \
    7. (ob1.getW() == ob2.getW()) &&(ob1.getH() == ob2.getH()))
    8. {
    9. return true;
    10. }
    11. else
    12. return false;
    13. }
    14. int main(int argc, char *argv[])
    15. {
    16. Cube ob1;
    17. ob1.setL(10);
    18. ob1.setW(10);
    19. ob1.setH(10);
    20. cout<<"面积为:"<<ob1.getS()<<endl;
    21. cout<<"体积为:"<<ob1.getV()<<endl;
    22. Cube ob2;
    23. ob2.setL(10);
    24. ob2.setW(20);
    25. ob2.setH(10);
    26. if(ob1.compareCube(ob2) == true)
    27. {
    28. cout<<"相等"<<endl;
    29. }
    30. else
    31. {
    32. cout<<"不相等"<<endl;
    33. }
    34. if(myCompareCube(ob1, ob2) == true)
    35. {
    36. cout<<"相等"<<endl;
    37. }
    38. else
    39. {
    40. cout<<"不相等"<<endl;
    41. }
    42. return 0;
    43. }

    知识点5【点Point和圆Circle的关系】

     

    1. #include <iostream>
    2. using namespace std;
    3. class Point
    4. {
    5. private:
    6. int m_x;
    7. int m_y;
    8. public:
    9. void setX(int x)
    10. {
    11. m_x = x;
    12. }
    13. int getX(void)
    14. {
    15. return m_x;
    16. }
    17. void setY(int y)
    18. {
    19. m_y = y;
    20. }
    21. int getY(void)
    22. {
    23. return m_y;
    24. }
    25. };
    26. class Circle
    27. {
    28. private:
    29. Point m_p;
    30. int m_r;
    31. public:
    32. void setPoint(int x, int y)
    33. {
    34. m_p.setX(x);
    35. m_p.setY(y);
    36. }
    37. void setR(int r)
    38. {
    39. m_r = r;
    40. }
    41. int getR(void)
    42. {
    43. return m_r;
    44. }
    45. int PointIsOnCircle(Point &p)
    46. {
    47. int tmp_x = (m_p.getX()-p.getX())*(m_p.getX()-p.getX());
    48. int tmp_y = (m_p.getY()-p.getY())*(m_p.getY()-p.getY());
    49. if((tmp_x+tmp_y) > (m_r*m_r))//圆外
    50. {
    51. return 1;
    52. }
    53. else if((tmp_x+tmp_y) == (m_r*m_r))//圆上
    54. {
    55. return 0;
    56. }
    57. else if((tmp_x+tmp_y) < (m_r*m_r))//圆内
    58. {
    59. return -1;
    60. }
    61. }
    62. };
    63. int main(int argc, char *argv[])
    64. {
    65. Point p1;
    66. p1.setX(5);
    67. p1.setY(5);
    68. Circle c1;
    69. c1.setPoint(2,2);
    70. c1.setR(5);
    71. int ret = c1.PointIsOnCircle(p1);
    72. if( ret== 0)
    73. {
    74. cout<<"圆上"<<endl;
    75. }
    76. else if(ret == 1)
    77. {
    78. cout<<"圆外"<<endl;
    79. }
    80. else if(ret == -1)
    81. {
    82. cout<<"圆内"<<endl;
    83. }
    84. return 0;
    85. }

     

  • 相关阅读:
    杠杆是实现财富的基础
    Redis配置与优化
    Spring事务配置(案例:转账业务追加日志,事务传播行为)
    Android java synchronized原理
    dolphinscheduler 2.0.5和2.0.6 体验记录及优化扩展(任务出现kill状态、未设置延时执行出现延时执行、系统变量扩展)
    Swagger3被拦截器拦截并报错Unable to infer base url或者Unable to render this definition
    oracle截取字符串前几位用substr函数如何操作?
    el-date-picker 有效时间精确到时分秒 且给有效时间添加标记
    第7集丨ObjectScript JSON 中 dynEnt 方法汇总
    Vue实现手风琴效果
  • 原文地址:https://blog.csdn.net/qq_34981463/article/details/124994099