`

学习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++实现二叉树功能的插入删除等等基本操作

    在C++中,我们可以定义一个结构体或类来表示二叉树的节点: ```cpp struct TreeNode { int val; // 节点的值 TreeNode* left; // 左子节点 TreeNode* right; // 右子节点 TreeNode(int x) : val(x), left(NULL)...

    C++ Builder 中的自画功能

    ((TComboBox*)Control)-&gt;Canvas-&gt;FillRect(Classes::Rect(Rect.Left + 2, Rect.Top + 2, Rect.Left + 14, Rect.Bottom - 2)); // 写文字 ((TComboBox*)Control)-&gt;Canvas-&gt;Font-&gt;Color = clBlack; ((TComboBox*...

    DirectShow使用 VS2005配置详细说明(附图)

    - 路径:`Project -&gt; BaseClasses properties -&gt; Configuration Properties -&gt; C/C++ -&gt; General -&gt; Additional Include Directories` - **错误 C4430**: 缺失类型说明符,默认为 int。 - 解决方案:在项目的 `...

    dirctshow使用说明非常有效

    对于C++标准语法问题,如for循环内变量作用域问题,可以通过修改项目属性来解决,具体是在Project-&gt;BaseClasses properties-&gt;configuration-&gt;C/C++-&gt;Language-&gt;Force Conformance in For Loop Scope设置为No。...

    C++双向循环链表的基本操作

    **C++ 双向循环链表的基本操作** ...通过定义节点结构,创建链表类并实现相关操作,我们可以在C++中灵活地管理这种链表。当与MFC结合时,可以创建用户友好的图形界面,使得链表操作更加直观和方便。

    vs2008 C++ MFC Access的数据库连接示例

    在本文中,我们将深入探讨如何使用Visual Studio 2008 (VS2008)中的C++ MFC(Microsoft Foundation Classes)库来连接并操作Microsoft Access数据库。Access数据库是微软提供的一种关系型数据库管理系统,它允许用户...

    c++开发一个简单累加的COM组件

    3. 添加方法:在类视图中,右键单击接口IFirstClass --&gt; “添加” --&gt; “方法”,添加一个新的方法Add,具有两个输入参数para1和para2,和一个返回参数result。 4. 定义IDL文件:在解决方案资源管理器中,双击打开...

    C++实现摄像头实时画面捕捉

    在本文中,我们将深入探讨如何使用C++编程语言在MFC(Microsoft Foundation Classes)框架下实现摄像头实时画面捕捉。MFC是微软提供的一种C++类库,它为开发Windows应用程序提供了一种方便的方式。 首先,要实现...

    树的创建和遍历(前序、中序、后序),并输出某个节点以前的所有祖先(精美的MFC画面实现)

    在C++中,实现树结构通常通过结构体或类来定义节点。例如: ```cpp struct TreeNode { int value; TreeNode* left; TreeNode* right; }; ``` 这个结构体表示一个二叉树节点,包含一个整数值、一个指向左子节点...

    MFC中用CEF实现c++与js交互

    在IT领域,MFC(Microsoft Foundation Classes)是微软提供的一套C++库,用于构建Windows应用程序。CEF(Chromium Embedded Framework)则是一个开源项目,它允许开发者将Google Chrome浏览器的Web渲染引擎嵌入到...

    OLE操作word和excel

    首先,你需要包含必要的头文件,如`Classes.h`,这将引入所有VCL相关的类型定义。然后,可以使用`TOleContainer`组件来启动Word或Excel进程并激活它们。在设计时,将这个组件拖放到表单上,并设置其`Active`属性为`...

    递归下降语法分析器C++实现

    本文将深入探讨如何使用C++实现一个递归下降语法分析器,并结合MFC(Microsoft Foundation Classes)库来构建用户界面,帮助开发者更好地理解和应用这一概念。 递归下降语法分析是一种自顶向下的解析方法,它通过一...

    C++---易学C++

    在VC中,用户可以编写、编译、调试C++项目,并且利用MFC(Microsoft Foundation Classes)库进行Windows应用程序的开发。 从压缩包中的"1-17.pdf"文件名来看,这很可能是书籍的前17章内容,涵盖了C++的基础部分,...

    C++Builder对串行口进行读写操作的一个通讯类.zip

    总的来说,C++Builder的串行通信功能强大且易于使用,通过创建自定义的通讯类,开发者可以更高效地管理串行口的读写,实现与其他设备的稳定交互。而提供的压缩包内容则为实现这一目标提供了一个具体的实例。

    算法与数据结构树的c++实现

    总结来说,"算法与数据结构树的C++实现"涉及到树数据结构的理解、C++中树节点的定义和操作实现,以及针对树的特定测试方法。通过掌握这些知识,开发者能更好地理解和应用树在实际问题中的解决方案。

    Visual C++6.0实例教程

    2. 创建工程:启动VC++6.0,选择"File" -&gt; "New" -&gt; "Project",然后选择合适的项目类型,如Win32 Console Application或Win32 Application。 3. 编辑代码:在新建的源文件中编写C++代码,可以使用内置的编辑器,...

    c++运行库2015-2019

    - C++标准库提供了大量预定义的类和函数,如输入/输出流、容器、算法、智能指针等,这些都是C++编程的基础。 - 2015至2019年间,C++标准库随着C++11、C++14和C++17新标准的引入,增加了许多新功能和改进,例如,...

    C++ Builder XE 读写EXCEL表格内容与设置属性实例.zip

    sheet-&gt;getFont(0)-&gt;setColor(LibXL::Color_RED); // 将第一行的字体颜色设为红色 sheet-&gt;getFont(0)-&gt;setBold(true); // 设置为粗体 ``` 5. **保存更改**: ```cpp book-&gt;save("modified_example.xls"); // ...

    ATL COM 实现参考[1].doc

    1. 打开VS2010,通过“文件”-&gt;“新建”-&gt;“项目”选择“Visual C++”-&gt;“ATL项目”,并输入项目名称。 2. 在ATL项目向导中,勾选“支持COM+ 1.0”和“支持部件注册器”,并按需设置其他选项,然后点击“完成”。 3....

    MFC中用c++语言实现连接SQLServer2008(附添加操作)

    在本文中,我们将深入探讨如何在MFC(Microsoft Foundation Classes)框架中使用C++语言来实现与SQL Server 2008的连接,并执行数据库的添加操作。这对于初学者来说是一份宝贵的指南,旨在帮助他们理解和掌握MFC与...

Global site tag (gtag.js) - Google Analytics