Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 219|回复: 0

[默认分类] 学习C++ -> 类(Classes)的定义与实现

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-5 16:21:28 | 显示全部楼层 |阅读模式
    学习C++ -> 类(Classes)的定义与实现



    一、"类" 的介绍
        在C++中, 用 "" 来描述 "对象", 所谓的"对象"是指现实世界中的一切事物。那么类就可以看做是对相似事物的抽象, 找到这些不同事物间的共同点, 如自行车和摩托车, 首先他们都属于"对象", 并且具有一定得相同点, 和一些不同点, 相同点如他们都有质量、都有两个轮子, 都是属于交通工具等。"都有质量"、"两个轮子"属于这个对象的属性, 而"都能够当做交通工具"属于该对象具有的行为, 也称方法。
       
        类是属于用户自定义的数据类型, 并且该类型的数据具有一定的行为能力, 也就是类中说描述的方法。通常来说, 一个类的定义包含两部分的内容, 一是该类的属性, 另一部分是它所拥有的方法。以 "人类" 这个类来说, 每个人都有自己的姓名、年龄、出生日期、体重等, 为 人类 的属性部分, 此外, 人能够吃饭、睡觉、行走、说话等属于人类所具有的行为。
       
        上面举例中所描述的 "人" 类仅仅是具有人这种对象的最基础的一些属性和行为, 可以称之为人的"基类"。 再说说一些具有一些职业的人, 例如学生, 一个学生还具有"基类"中所没有的属性, 如学校、班级、学号; 也可以具有基类所不具有的行为, 如每天需要去上课, 需要考试等。
       
        学生类可以看做是基类的一个扩展, 因为他具有基类的所有属性和行为, 并且在此基础上增加了一些基类所没有的属性和行为, 像"学生"这样的类称为"人类"这个基类的"派生类"或者"子类"。在学生的基础上海可以进一步的扩展出其他更高级的类, 如"研究生"类。
       
        到此, 我们不再更深的去介绍类的其他相关知识。
       
       

       
    二、C++类的定义
        C++中使用关键字 class 来定义类, 其基本形式如下:

    1.     class 类名
    2. {
    3. public:
    4. //公共的行为或属性
    5.         private:
    6. //公共的行为或属性
    7.     };
    复制代码


        说明:
            ①. 类名 需要遵循一般的命名规则;
            
            ②. publicprivate 为属性/方法限制的关键字, private 表示该部分内容是私密的, 不能被外部所访问或调用, 只能被本类内部访问; 而 public 表示公开的属性和方法, 外界可以直接访问或者调用。
                一般来说类的属性成员都应设置为private, public只留给那些被外界用来调用的函数接口, 但这并非是强制规定, 可以根据需要进行调整;
                
            ③. 结束部分的分号不能省略。
            
            
        类定义示例:
            定义一个点(Point)类, 具有以下属性和方法:
                ■ 属性: x坐标, y坐标
                ■ 方法: 1.设置x,y的坐标值; 2.输出坐标的信息。

            实现代码如下:

    1.             class Point
    2.             {
    3.                 public:
    4.                     void setPoint(int x, int y);
    5.                     void printPoint();
    6.                 private:
    7.                     int xPos;
    8.                     int yPos;
    9.             };
    复制代码

                
        代码说明:
            上段代码中定义了一个名为 Point 的类, 具有两个私密属性, int型的xPos和yPos, 分别用来表示x点和y点。在方法上, setPoint 用来设置属性, 也就是 xPos 和 yPos 的值; printPoint 用来输出点的信息。
            
            类在定义时有以下几点需要注意:
                ①. 类的数据成员中不能使用 auto、extern和register等进行修饰, 也不能在定义时进行初始化, 如 int xPos = 0; //错;
                ②. 类定义时 private 和 public 关键词出现的顺序和次数可以是任意的;
                ③. 结束时的分号不能省略, 切记!
                
                

                
    三、C++类的实现
        在上面的定义示例中我们只是定义了这个类的一些属性和方法声明, 并没有去实现它, 类的实现就是完成其方法的过程。类的实现有两种方式, 一种是在类定义时完成对成员函数的定义, 另一种是在类定义的外部进行完成。
       
        1>. 在类定义时定义成员函数
            成员函数的实现可以在类定义时同时完成, 如代码:

    1. 1         #include <iostream>
    2. 2
    3. 3         using namespace std;
    4. 4
    5. 5         class Point
    6. 6         {
    7. 7             public:
    8. 8                 void setPoint(int x, int y) //实现setPoint函数
    9. 9                 {
    10. 10                     xPos = x;
    11. 11                     yPos = y;
    12. 12                 }
    13. 13
    14. 14                 void printPoint()       //实现printPoint函数
    15. 15                 {
    16. 16                     cout<< "x = " << xPos << endl;
    17. 17                     cout<< "y = " << yPos << endl;
    18. 18                 }
    19. 19
    20. 20             private:
    21. 21                 int xPos;
    22. 22                 int yPos;
    23. 23         };
    24. 24
    25. 25         int main()
    26. 26         {
    27. 27             Point M;        //用定义好的类创建一个对象 点M
    28. 28             M.setPoint(10, 20); //设置 M点 的x,y值
    29. 29             M.printPoint();     //输出 M点 的信息
    30. 30
    31. 31             return 0;
    32. 32         }
    复制代码


            运行输出:

    1.         x = 10
    2.         y = 20
    3.         Process returned 0 (0x0)   execution time : 0.406 s
    4.         Press any key to continue.
    复制代码


            与类的定义相比, 在类内实现成员函数不再是在类内进行声明, 而是直接将函数进行定义, 在类中定义成员函数时, 编译器默认会争取将其定义为 inline 型函数。
            
            
        2>. 在类外定义成员函数
            在类外定义成员函数通过在类内进行声明, 然后在类外通过作用域操作符 :: 进行实现, 形式如下:

    1. 返回类型 类名::成员函数名(参数列表)
    2. {
    3. //函数体
    4.         }
    复制代码

            
            将示例中的代码改用类外定义成员函数的代码:


    1. 1         #include <iostream>
    2. 2
    3. 3         using namespace std;
    4. 4
    5. 5         class Point
    6. 6         {
    7. 7             public:
    8. 8                 void setPoint(int x, int y); //在类内对成员函数进行声明
    9. 9                 void printPoint();
    10. 10
    11. 11             private:
    12. 12                 int xPos;
    13. 13                 int yPos;
    14. 14         };
    15. 15
    16. 16         void Point::setPoint(int x, int y) //通过作用域操作符 "::" 实现setPoint函数
    17. 17         {
    18. 18             xPos = x;
    19. 19             yPos = y;
    20. 20         }
    21. 21
    22. 22         void Point::printPoint()       //实现printPoint函数
    23. 23         {
    24. 24             cout<< "x = " << xPos << endl;
    25. 25             cout<< "y = " << yPos << endl;
    26. 26         }
    27. 27
    28. 28         int main()
    29. 29         {
    30. 30             Point M;        //用定义好的类创建一个对象 点M
    31. 31             M.setPoint(10, 20); //设置 M点 的x,y值
    32. 32             M.printPoint();     //输出 M点 的信息
    33. 33
    34. 34             return 0;
    35. 35         }
    复制代码

            
            依 setPoint 成员函数来说, 在类内声明的形式为 void setPoint(int x, int y); 那么在类外对其定义时函数头就应该是 void Point::setPoint(int x, int y) 这种形式, 其返回类型、成员函数名、参数列表都要与类内声明的形式一致。
            
            


    四、C++类的使用
        将一个类定义并实现后, 就可以用该类来创建对象了, 创建的过程如同 int、char 等基本数据类型声明一个变量一样简单, 例如我们有一个Point类, 要创建一个Point的对象只需要:

    1.         Point 对象名;
    复制代码


        创建一个类的对象称为该类的实例化, 在创建时我们还可以对对象的属性进行相关的初始化, 这样在创建完成后该对象就已经具有了一定得属性, 这种创建方式将在下一篇博文中进行学习。
        将类进行实例化后系统才会根据该对象的实际需要分配一定的存储空间。这样就可以使用该对象来访问或调用该对象所能提供的属性或方法了。
       
        还以上面的代码为例, 为了减少篇幅, 我们把 Point 类的实现放在 Point.h 头文件中, 这里不再贴出 Point 类的实现代码。
       

    1. 1     #include <iostream>
    2. 2     #include "Point.h"
    3. 3
    4. 4     using namespace std;
    5. 5
    6. 6     int main()
    7. 7     {
    8. 8         Point M;        //用定义好的类创建一个对象 点M
    9. 9         M.setPoint(10, 20);         //设置 M点 的x,y值
    10. 10         M.printPoint();             //输出 M点 的信息
    11. 11         cout<< M.xPos <<endl;       //尝试通过对象M访问属性xPos
    12. 12
    13. 13         return 0;
    14. 14     }
    复制代码


        代码在编译时会出现错误, 提示 error: "int Point::xPos" is private, 这是 cout<< M.xPos <<endl; 这行造成的, 他试图访问一个 private 对象中的私密数据 xPos, 如果将这行去掉便可正常运行。
       
        通过 对象名.公有函数名(参数列表); 的形式就可以调用该类对象所具有的方法, 通过 对象名.公有数据成员; 的形式可以访问对象中的数据成员。
       
       


    五、对象的作用域、可见域与生存周期
        类对象的作用域、可见域以及生存周期与普通变量的保持相同, 当对象生存周期结束时对象被自动撤销, 所占用的内存被回收, 需要注意的是, 如果对象的成员函数中有使用 new 或者 malloc 申请的动态内存程序不会对其进行释放, 需要我们手动进行清理, 否则会造成内存泄露。
       
       

       
    --------------------


    wid, 2013.02.18

    上一篇: 学习C++ -> 进一步了解函数
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-11 11:03 , Processed in 0.376741 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表