当前位置:   article > 正文

C++类的定义与实现_c++ 类和实现

c++ 类和实现

一、面向对象与面向过程的区别

        举个例子,在我们完成小组任务中,一般会有两种分配任务的方法:

        (1)根据每个人(即每个对象)擅长的工作,分配相应的任务(即对象的行为);

        (2)分析出解决问题所需要的步骤,每人完成一个步骤(功能函数)。

        方法(1)就是面向对象的设计思想,将问题分解成各个对象,每个对象有确定的行为,而不是去完成一个步骤。那么方法(2)就是面向过程的设计思想,每人通过函数将实现一个步骤(因为不一定是自身擅长的,那么每个人就不重要了,重要的是每个步骤),使用的时候调用相应的功能函数即可。

        C++就是一种面向对象的语言。

二、“类”的定义与实现

1.什么是“类”

        (1)类:具有同种属性的对象。例如:

(2)类的四大特性:封装性、继承性、多态性、抽象性。

这里先讲一个封装性:一般对象都具有属性和行为。对于一个人,身高、年龄、性别是他的属性,吃饭、睡觉是他的行为,我们将一个对象的属性和方法封装在一个类,即为封装。

2.类的定义

C++中使用关键字class来定义类,以上述第二个为例,格式如下:

  1. class Goods //类名--商品
  2. {
  3. public:
  4. //公共的行为或属性,所有人都可以访问
  5. string Name; //名称
  6. private:
  7. //私有的行为或属性,只能该类内部访问
  8. int Amount; //数量
  9. float Price; //单价
  10. protected:
  11. //被保护的行为或属性,不能被外界访问,但是能被子类直接访问
  12. //子类:继承了父类的属性和方法,也可以添加自己的属性的方法,后面会讲哦~
  13. float Total; //总价
  14. };

说明:

   (1)类名、属性名在命名时尽量见名知意。

 (2)花括号中的部分称为类体,类体中定义了类的属性。

   (3)访问限定符有三种: public(公共的), private(私有的)和protected(保护的)。只有public说明的成员能从外部进行访问,每种说明符可在类体中使用多次。

   (4)访问说明符 private和 protected 体现了类具有封装性。

   (5)切记花括号后面的分号不能省略。

3.类的实现

类的实现有两种方法:(1)成员函数在类体内定义;(2)成员函数在类体内声明,类外定义。

(1)在类体内定义方法,格式如下:

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. class Goods
  5. {
  6. private:
  7. string Name;
  8. int Amount;
  9. float Price;
  10. float Total;
  11. public:
  12. void RegisterGoods(const string& name, int num, float price) //初始化数据
  13. {
  14. Name = name;
  15. Amount = num;
  16. Price = price;
  17. CountTotal();
  18. }
  19. void CountTotal() //计算商品总价值
  20. {
  21. Total = Amount * Price;
  22. }
  23. string GetName() //读取商品名
  24. {
  25. return Name;
  26. }
  27. };
  28. int main()
  29. {
  30. Goods book; //用定义好的类创建了一个对象 book
  31. book.RegisterGoods("父与子 ", 20, 25.5f); //初始化book的属性
  32. cout << book.GetName() << endl; //输出book的名称
  33. }

说明:在类内直接定义成员函数,在编译阶段编译器会默认其为inline(内联)型函数。

(2)在类体内声明,类外定义,格式如下:

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. class Goods
  5. {
  6. private:
  7. string Name;
  8. int Amount;
  9. float Price;
  10. float Total;
  11. public:
  12. void RegisterGoods(const string&, int, float); //声明可以给形参,可以不给
  13. void CountTotal();
  14. float GetTotal();
  15. };
  16. //在类外定义需要加作用域解析符
  17. void Goods::RegisterGoods(const string& name, int num, float price)
  18. {
  19. Name = name;
  20. Amount = num;
  21. Price = price;
  22. CountTotal();
  23. }
  24. void Goods::CountTotal()
  25. {
  26. Total = Amount * Price;
  27. }
  28. float Goods::GetTotal()
  29. {
  30. return Total;
  31. }
  32. int main()
  33. {
  34. Goods book; //用定义好的类创建了一个对象 book
  35. book.RegisterGoods("父与子 ", 20, 25.5f); //初始化book的属性
  36. cout << book.GetTotal() << endl; //510
  37. }

说明:

(1)运算符 “::”: 作用域解析符 ,它指出该函数是属于哪一个类的成员函数。
    
  1. 返回类型 类名:: 函数名(方法名)
  2. {
  3. 函数体;
  4. }

(2)在类外定义时,函数的返回类型、函数名、参数列表都应与类内声明一致(类内声明时可以不定义形参)。

三、this指针

有下面一个例子:

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. class Goods
  5. {
  6. private:
  7. string Name;
  8. int Amount;
  9. float Price;
  10. float Total;
  11. public:
  12. void RegisterGoods(string&, int, float); //初始化数据
  13. void CountTotal(); //计算商品总价值
  14. float GetTotal(); //读取商品总价值
  15. };
  16. void Goods::RegisterGoods(string name, int amount, float price)
  17. {
  18. Name = name;
  19. Amount = amount;
  20. Price = price;
  21. }
  22. void Goods::CountTotal()
  23. {
  24. Total= Price * Amount;
  25. }
  26. float Goods::GetTotal()
  27. {
  28. return Total;
  29. }
  30. int main()
  31. {
  32. Goods book, pen;
  33. book.RegisterGoods("book", 12, 10.5);
  34. book.CountTotal();
  35. cout << book.GetTotal() << endl; //126
  36. pen.RegisterGoods("pen", 20, 7.5);
  37. pen.CountTotal();
  38. cout << pen.GetTotal() << endl; //150
  39. return 0;
  40. }
当book.RegisterGoods("book", 12, 10.5)和pen.RegisterGoods("pen", 20, 7.5)时,RegisterGoods函数是怎样知道处理的是book还是pen的数据呢?

this指针:

编译器针对程序员自己设计的类型分三次编译。
第一:识别和记录类体中属性的名称、类型和访问限定,与属性在类体中的位置无关。
第二:识别和记录类体中函数原型(返回类型 + 函数名 + 参数列表)、形参的默认值、访问限定,不识别函数体。
第三:改写在类中定义函数的参数列表和函数体,改写对象调用成员函数的形式。
举例:
  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. class Goods
  5. {
  6. private:
  7. string Name;
  8. int Amount;
  9. float Price;
  10. float Total;
  11. public:
  12. //void RegisterGoods(Goods* this,string&,int,float);
  13. void RegisterGoods(string&, int, float); //初始化数据
  14. //void CountTotal(Goods* this);
  15. void CountTotal(); //计算商品总价值
  16. //float GetTotal(Goods* this);
  17. float GetTotal(); //读取商品总价值
  18. };
  19. //void RegisterGoods(Goods* this,string&,int,float);
  20. void Goods::RegisterGoods(string name, int amount, float price)
  21. {
  22. Name = name; //this->Name = name;
  23. Amount = amount; //this->Amount = amount;
  24. Price = price; //this->Price = price;
  25. }
  26. //void CountTotal(Goods* this);
  27. void Goods::CountTotal()
  28. {
  29. //this->Total = this->Amount * this->Price;
  30. Total= Price * Amount;
  31. }
  32. //float GetTotal(Goods* this);
  33. float Goods::GetTotal()
  34. {
  35. return Total;
  36. //return this->Total;
  37. }
  38. int main()
  39. {
  40. Goods book, pen;
  41. book.RegisterGoods("book", 12, 10.5);
  42. book.CountTotal(); //CountTotal(&book);
  43. cout << book.GetTotal() << endl; //126
  44. pen.RegisterGoods("pen", 20, 7.5);
  45. pen.CountTotal(); //CountTotal(&pen);
  46. cout << pen.GetTotal() << endl; //150
  47. return 0;
  48. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/43807
推荐阅读
相关标签
  

闽ICP备14008679号