Cpp_类的定义与实现

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




一、"类" 的介绍
    在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 申请的动态内存程序不会对其进行释放, 需要我们手动进行清理, 否则会造成内存泄露。
    
    


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



wid, 2013.02.18

### 回答1: c_cpp_properties.json 可以通过使用 CMake 或者其他构建工具自动生成。在 CMake 中,可以使用命令“cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1”生成 compile_commands.json 文件,然后使用工具“clangd”或“IntelliSense”将其转换为 c_cpp_properties.json 文件。在其他构建工具中,可以查看其文档以了解如何生成 c_cpp_properties.json 文件。 ### 回答2: c_cpp_properties.json文件是用于配置C/C++扩展的编辑器设置的。 在Visual Studio Code中,c_cpp_properties.json文件可以通过以下步骤进行自动生成: 1. 打开Visual Studio Code编辑器。 2. 在编辑器顶部的菜单栏中,选择“文件”>“首选项”>“设置”。 3. 在设置页面的搜索框中,输入“C_Cpp: Edit Configuration”并点击该设置选项。 4. 点击“编辑工作区设置”以打开当前工作区的设置文件。 5. 在设置文件中,使用下面的模板来定义c_cpp_properties.json文件的配置: ``` "c_cpp_properties": { "configurations": [ { "name": "Mac", "includePath": [ "${workspaceFolder}/**" ], "macFrameworkPath": [ "/System/Library/Frameworks" ], "defines": [], "intelliSenseMode": "clang-x64" }, { "name": "Linux", "includePath": [ "${workspaceFolder}/**" ], "defines": [], "intelliSenseMode": "gcc-x64" }, { "name": "Win32", "includePath": [ "${workspaceFolder}/**" ], "defines": [], "windowsSdkVersion": "10.0.19041.0", "intelliSenseMode": "msvc-x64" } ], "version": 4 } ``` 6. 根据不同的操作系统需求,修改配置中的路径和参数,例如在"Mac"部分修改"includePath"和"macFrameworkPath",在"Linux"部分修改"includePath"等等。 7. 保存设置文件后,Visual Studio Code将自动在当前工作区的根目录下生成c_cpp_properties.json文件,并将其用于C/C++扩展的设置。 通过按照以上步骤创建和修改c_cpp_properties.json文件,我们可以根据需求配置C/C++扩展的编辑器设置。 ### 回答3: c_cpp_properties.json是用于配置C/C++语言开发环境的配置文件,它可以用来指定编译器路径、头文件路径、库文件路径等信息。 c_cpp_properties.json的自动生成可以通过以下几种方式实现: 1. 使用VSCode的C/C++插件:VSCode的C/C++插件可以自动帮助我们生成c_cpp_properties.json文件。在打开C/C++项目时,插件会自动检测项目中的源代码,并根据代码中的依赖关系推测出编译器的路径、头文件路径和库文件路径,并将这些信息写入c_cpp_properties.json文件中。 2. 使用cmake工具:如果项目使用cmake进行构建,可以使用cmake自动生成c_cpp_properties.json文件。在CMakeLists.txt文件中,可以使用`configure_file`命令将模板的c_cpp_properties.json文件复制到项目的目标路径,并自动填充相关路径信息。 3. 手动编写配置文件:如果以上两种方式不能满足需求,可以手动编写c_cpp_properties.json文件。首先,需要根据编译环境和项目特点,确定编译器路径、头文件路径和库文件路径等信息,然后在该文件中进行手动配置。 无论选择哪种方式,最终都需要确保c_cpp_properties.json文件中包含正确的编译器路径、头文件路径和库文件路径等信息,以保证项目能够正确编译和运行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值