当前位置:   article > 正文

C++类(Class)的定义与实现_c++ class

c++ class

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

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

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

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

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

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

运行输出:

  1. x = 10
  2. y = 20

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

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

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

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

c++ 类的定义和使用

  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <string>
  4. using namespace std;
  5. class A
  6. {
  7. private:
  8. int n2;
  9. int n1;
  10. public:
  11. A() :n2(34), n1(n2+1) {}
  12. void Print() {
  13. cout << "n1:" << n1 << ", n2: " << n2 << endl;
  14. }
  15. };
  16. int main()
  17. {
  18. A a;
  19. a.Print();
  20. getchar();
  21. return 1;
  22. }

这里写图片描述




对上面代码稍微做调整: 将n1和n2两个变量定义的顺序互换一下


  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <string>
  4. using namespace std;
  5. class A
  6. {
  7. private:
  8. int n1;
  9. int n2;
  10. public:
  11. A() :n2(34), n1(n2+1) {}
  12. void Print() {
  13. cout << "n1:" << n1 << ", n2: " << n2 << endl;
  14. }
  15. };
  16. int main()
  17. {
  18. A a;
  19. a.Print();
  20. getchar();
  21. return 1;
  22. }

打印结果:


这里写图片描述




由此可以总结: 构造函数中,变量初始化的顺序,是以变量定义的顺序来定的,而不是简单的以构造函数中变量出现的顺序来定的


还可以使用有参的构造函数:


  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <string>
  4. using namespace std;
  5. class A
  6. {
  7. private:
  8. int n1;
  9. int n2;
  10. public:
  11. A(int k1,int k2) :n2(k1), n1(k2) {}
  12. void Print() {
  13. cout << "n1:" << n1 << ", n2: " << n2 << endl;
  14. }
  15. };
  16. int main()
  17. {
  18. A a(78,97);
  19. a.Print();
  20. getchar();
  21. return 1;
  22. }
  •  

打印结果:


这里写图片描述



下面对上面进行改造一下:

  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <string>
  4. using namespace std;
  5. class A
  6. {
  7. private:
  8. int n1;
  9. int n2;
  10. public:
  11. A(int k1) :n2(k1), n1(n2) {}
  12. void Print() {
  13. cout << "n1:" << n1 << ", n2: " << n2 << endl;
  14. }
  15. };
  16. int main()
  17. {
  18. A a(115);
  19. a.Print();
  20. getchar();
  21. return 1;
  22. }

打印结果: 
这里写图片描述


通过最后一个例子,再次证明,变量初始化的顺序是严格按照各个变量定义的先后顺序来的,而不是简单的依据各变量在构造函数中出现的先后顺序来定的



下面两种写法是一个意思: 
写法一:

  1. public:
  2. A(int k1,int k2) {
  3. n1 = k1;
  4. n2 = k2;
  5. }

写法二:

  1. public:
  2. A(int k1,int k2) :n1(k1),n2(k2){}

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/43824
推荐阅读
  

闽ICP备14008679号