`

学习C++ -> 类(Classes)的定义与实现

    博客分类:
  • C++
 
阅读更多
[size=medium]




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


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


    class 类名
    {
        public:
            //公共的行为或属性

        private:
            //公共的行为或属性
    };



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

        实现代码如下:


           
class Point
            {
                public:
                    void setPoint(int x, int y);
                    void printPoint();

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


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

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

        运行输出:

        x = 10
        y = 20

        Process returned 0 (0x0)   execution time : 0.406 s
        Press any key to continue.

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

        返回类型 类名::成员函数名(参数列表)
        {
            //函数体
        }
       
        将示例中的代码改用类外定义成员函数的代码:



 1         #include <iostream>
 2 
 3         using namespace std;
 4 
 5         class Point
 6         {
 7             public:
 8                 void setPoint(int x, int y); //在类内对成员函数进行声明
 9                 void printPoint();
10 
11             private:
12                 int xPos;
13                 int yPos;
14         };
15 
16         void Point::setPoint(int x, int y) //通过作用域操作符 '::' 实现setPoint函数
17         {
18             xPos = x;
19             yPos = y;
20         }
21 
22         void Point::printPoint()       //实现printPoint函数
23         {
24             cout<< "x = " << xPos << endl;
25             cout<< "y = " << yPos << endl;
26         }
27 
28         int main()
29         {
30             Point M;        //用定义好的类创建一个对象 点M
31             M.setPoint(10, 20); //设置 M点 的x,y值
32             M.printPoint();     //输出 M点 的信息
33 
34             return 0;
35         }
复制代码
       
        依 setPoint 成员函数来说, 在类内声明的形式为 void setPoint(int x, int y); 那么在类外对其定义时函数头就应该是 void Point::setPoint(int x, int y) 这种形式, 其返回类型、成员函数名、参数列表都要与类内声明的形式一致。
       
       




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

        Point 对象名;

    创建一个类的对象称为该类的实例化, 在创建时我们还可以对对象的属性进行相关的初始化, 这样在创建完成后该对象就已经具有了一定得属性, 这种创建方式将在下一篇博文中进行学习。
    将类进行实例化后系统才会根据该对象的实际需要分配一定的存储空间。这样就可以使用该对象来访问或调用该对象所能提供的属性或方法了。
   
    还以上面的代码为例, 为了减少篇幅, 我们把 Point 类的实现放在 Point.h 头文件中, 这里不再贴出 Point 类的实现代码。
   
 1     #include <iostream>
 2     #include "Point.h"
 3 
 4     using namespace std;
 5 
 6     int main()
 7     {
 8         Point M;        //用定义好的类创建一个对象 点M
 9         M.setPoint(10, 20);         //设置 M点 的x,y值
10         M.printPoint();             //输出 M点 的信息
11         cout<< M.xPos <<endl;       //尝试通过对象M访问属性xPos
12 
13         return 0;
14     }
复制代码

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




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


   
--------------------[/size]
分享到:
评论

相关推荐

    C++编程思想 pdf

    42&lt;br/&gt;3.2 C++的存取控制 42&lt;br/&gt;3.3 友元 44&lt;br/&gt;3.3.1 嵌套友元 45&lt;br/&gt;3.3.2 它是纯的吗 48&lt;br/&gt;3.4 对象布局 48&lt;br/&gt;3.5 类 48&lt;br/&gt;3.5.1 用存取控制来修改stash 50&lt;br/&gt;3.5.2 用存取控制来修改stack 51&lt;br/&gt;...

    c++基础教程,简洁扼要

    -&gt; 这是一个引用操作符,常与结构或类的指针一起使用,以便引用其中的成员元素,这样就避免使用很多括号。例如,我们用: pmovie-&gt;title 来代替: (*pmovie).title 79 自定义数据类型(User defined data types) ...

    Visual C++ 2005入门经典--源代码及课后练习答案

     本书系编程语言先驱者Ivor Horton的经典之作,是学习C++编程最畅销的图书品种之一,不仅涵盖了Visual C++ .NET编程知识,还全面介绍了标准C++语言和.NET C++/CLI。本书延续了Ivor Horton讲解编程语言的独特方法,...

    新版Android开发教程.rar

    开放手机联盟, Open Handset Alliance :是美国 Google 公司与 2007 年 11 月 5 日宣布组建的一个全球性的联 盟组织。这一联盟将会支持 Google 发布的 Android 手机操作系统或者应用软件,共同开发名为 Android 的 ...

    C++ 语言 详细教程电子版

    内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚函数、模板和包容器...

    Effective C++ 中文版

     《Effective C++中文版(第3版改善程序与设计的55个具体做法)》不是读完一遍就可以束之高阁的快餐读物,也不是用以解决手边问题的参考手册,而是需要您去反复阅读体会的,C++是真正程序员的语言,背后有着精深的...

    C++编程思想(1)

    隐藏实现 42&lt;br&gt;3.1 设置限制 42&lt;br&gt;3.2 C++的存取控制 42&lt;br&gt;3.3 友元 44&lt;br&gt;3.3.1 嵌套友元 45&lt;br&gt;3.3.2 它是纯的吗 48&lt;br&gt;3.4 对象布局 48&lt;br&gt;3.5 类 48&lt;br&gt;3.5.1 用存取控制来修改stash 50&lt;br&gt;3.5.2 用存取控制...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    7.11.3 定义引用类类型的复制构造函数 346 7.11.4 类属性 346 7.11.5 initonly字段 358 7.11.6 静态构造函数 360 7.12 小结 360 7.13 练习 360 7.14 本章主要内容 361 第8章 深入理解类 363 8.1 类析构函数 ...

    c++.编程思想

    隐藏实现 42&lt;br/&gt;3.1 设置限制 42&lt;br/&gt;3.2 C++的存取控制 42&lt;br/&gt;3.3 友元 44&lt;br/&gt;3.3.1 嵌套友元 45&lt;br/&gt;3.3.2 它是纯的吗 48&lt;br/&gt;3.4 对象布局 48&lt;br/&gt;3.5 类 48&lt;br/&gt;3.5.1 用存取控制来修改stash 50&lt;br/&gt;3.5.2 用...

    C++编程思想 (作者学习C++亲身体会及多年教学经验)

    内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚函数、模板和包容器...

    VTK User's Guide(中文完整版)

    C++---------------------------------------------------------------------------------------------20 Java Phthon Visual Basic/COM/ActiveX 3.3 在两种语言间转换 第二部分 通过例子学习VTK 第4章 基础...

    C++编程思想

    隐藏实现 42&lt;br/&gt;3.1 设置限制 42&lt;br/&gt;3.2 C++的存取控制 42&lt;br/&gt;3.3 友元 44&lt;br/&gt;3.3.1 嵌套友元 45&lt;br/&gt;3.3.2 它是纯的吗 48&lt;br/&gt;3.4 对象布局 48&lt;br/&gt;3.5 类 48&lt;br/&gt;3.5.1 用存取控制来修改stash 50&lt;br/&gt;3.5.2 用...

    C++编程思想.pdf

    内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚函数、模板和包容器...

    c++学习经典图书:C++ 编程思想(全).rar

    内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚函数、模板和包容器...

    C++编程思想6-10

    3.6 句柄类(handle classes) 51 3.6.1 可见的实现部分 51 3.6.2 减少重复编译 52 3.7 小结 54 3.8 练习 54 第4章 初始化与清除 55 4.1 用构造函数确保初始化 55 4.2 用析构函数确保清除 56 4.3 清除定义块 58 ...

    C++编程思想 例子和叙述讲解C++编程

    3.6 句柄类(handle classes) 51 3.6.1 可见的实现部分 51 3.6.2 减少重复编译 52 3.7 小结 54 3.8 练习 54 第4章 初始化与清除 55 4.1 用构造函数确保初始化 55 4.2 用析构函数确保清除 56 4.3 清除定义块 58 ...

    C++编程思想 编程

    3.6 句柄类(handle classes) 51 3.6.1 可见的实现部分 51 3.6.2 减少重复编译 52 3.7 小结 54 3.8 练习 54 第4章 初始化与清除 55 4.1 用构造函数确保初始化 55 4.2 用析构函数确保清除 56 4.3 清除定义块 58 ...

    C++编程思想(中文版) chm

    内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚函数、模板和包容器...

    C++编程思想11-15

    3.6 句柄类(handle classes) 51 3.6.1 可见的实现部分 51 3.6.2 减少重复编译 52 3.7 小结 54 3.8 练习 54 第4章 初始化与清除 55 4.1 用构造函数确保初始化 55 4.2 用析构函数确保清除 56 4.3 清除定义块 58 ...

Global site tag (gtag.js) - Google Analytics