【C++】类的构造函数与析构函数笔记

举报
王博Kings 发表于 2020/12/29 22:49:00 2020/12/29
【摘要】 目录 0. 整体概述为什么要引入构造函数  1. 声明和定义构造函数 程序声明对象时,将自动调用构造函数 1.1 成员名和参数名 2. 使用构造函数 2.1 显式调用构造函数 2.2 隐式调用构造函数 2.3 构造函数与new一起使用的方法 3. 默认构造函数 4. 析构函数 什么时候调用析构函数呢? 5 改进Stock类 stock10.h St...

目录

0. 整体概述为什么要引入构造函数 

1. 声明和定义构造函数

程序声明对象时,将自动调用构造函数

1.1 成员名和参数名

2. 使用构造函数

2.1 显式调用构造函数

2.2 隐式调用构造函数

2.3 构造函数与new一起使用的方法

3. 默认构造函数

4. 析构函数

什么时候调用析构函数呢?

5 改进Stock类

stock10.h

Stock10.cpp

 usestock2.cpp

const成员函数


 

0. 整体概述为什么要引入构造函数 

回顾【C++】抽象和类(2)--如何实现类成员函数?

截止到上一节,提供的代码不能直接像  int  或者  结构那样来初始化Stock对象。

常规的初始化语法不适用于类型Stock:


  
  1. int year = 2001;
  2. struct thing
  3. {
  4. char * pn;
  5. int m;
  6. }
  7. thing amabob = { "hewlosd" , -30 }; //结构的初始化
  8. Stock hot = { "Mary tup", 2304, 4353}; //错误的初始化

不能像上面这样直接Stock初始化的原因是:数据部分是隐藏的,是私有的,程序不能直接访问数据成员。

程序只能通过成员函数来访问数据成员,因此需要设计合适的成员函数,才能成功地将对象初始化。

一般来说,最好是在创建对象时进行初始化:

stock gift;

gift.buy (10,  27.34);

类设计假设用户在调用其他成员函数时,都已经进行了自动初始化,C++将这种特殊的成员函数称为----类构造函数,将专门用于构造对象,将值赋给他们的数据成员。

类构造函数明察与类名相同:Stock 类 一个可能的构造函数是名为 Stock() 的成员函数。

1. 声明和定义构造函数


  
  1. // stock00.h -- Stock class interface
  2. // 版本 00 类的声明
  3. #ifndef STOCK00_H_
  4. #define STOCK00_H_
  5. #include<string>
  6. class Stock
  7. {
  8. public:
  9. void acquire(const std::string & co, long n, double pr);
  10. void buy(long num, double price);
  11. void sell(long num, double price);
  12. void update(double price);
  13. void show();
  14. private:
  15. std::string company;
  16. long shares; //股票数量
  17. double share_val; // 每股的价格
  18. double total_val; //股票的总价格
  19. void set_tot()
  20. {
  21. total_val = shares*share_val;
  22. }
  23. };
  24. #endif

需要为Stock 对象提供3个值,构造函数为3个参数,第四个值total_val是其他计算得来,不用提供这个值。

原型如下:

// 声明的原型可能是

Stock ( const string & co , long n = 0, double pr = 0.0 );

构造函数的一种可能的定义是:

// 构造函数定义

Stock::Stock(const string & co , long n , double , pr)

{

    company = co;
    if (n < 0)
    {
        std::cout << "股票数量不能设置为0; "
            << company << " shares set to 0. \n";
        shares = 0;
    }
    else
    {
        shares = n;
    }
    share_val = pr;

   set_tot();

}

程序声明对象时,将自动调用构造函数

1.1 成员名和参数名

2. 使用构造函数

2.1 显式调用构造函数

Stock food = Stock("Wrojfs sfas", 374, 2.42);

2.2 隐式调用构造函数

Stock garment( "Furry Mason", 50, 3.5 );

与下面等价:

Stock garment = Stock( "Furry Mason", 50, 3.5 );

2.3 构造函数与new一起使用的方法

Stock * pstock = new Stock("Yhdisf hiushfoisf", 34, 39.2);

对象没有名称,但可以使用指针来管理该对象!对象指针

3. 默认构造函数

默认构造函数是在未提供显示初值时,用来创建对象的构造函数。

比如:

Stock fluffy_dha;  //使用默认构造函数,隐式版本

Stock:: Stock(){}

4. 析构函数

析构函数用来清理:  ~stock();

析构函数不承担任何工作,所以编写为不执行任何操作的函数

Stock::~Stock()

{

}

为了能看清楚何时被调用,可以这样编写

Stock::~Stock()

{

  cout<<" 再见了  ,  "<<company<<endl;

}

什么时候调用析构函数呢?

5 改进Stock类

stock10.h


  
  1. // stock00.h -- Stock class interface
  2. // 版本 00 类的声明
  3. #ifndef STOCK00_H_
  4. #define STOCK00_H_
  5. #include<string>
  6. class Stock
  7. {
  8. public:
  9. Stock();
  10. Stock(const std::string & co, long n = 0, double pr = 0.0 );
  11. ~Stock();
  12. void buy(long num, double price);
  13. void sell(long num, double price);
  14. void update(double price);
  15. void show();
  16. private:
  17. std::string company;
  18. long shares; //股票数量
  19. double share_val; // 每股的价格
  20. double total_val; //股票的总价格
  21. void set_tot()
  22. {
  23. total_val = shares*share_val;
  24. }
  25. };
  26. #endif

Stock10.cpp


  
  1. // stock00.cpp -- 对类stock00.h进行函数描述
  2. // 版本还是00
  3. #include<iostream>
  4. #include"stock10.h"
  5. //构造函数
  6. stock::Stock()
  7. {
  8. std::cout<<"默认参数设置,这里是构造函数\n";
  9. company = "no name";
  10. shares = 0;
  11. share_val = 0.0;
  12. total_val = 0.0;
  13. }
  14. Stock::Stock(const std::string & co, long n, double pr)
  15. {
  16. company = co;
  17. if (n < 0)
  18. {
  19. std::cout << "股票数量不能设置为0; "
  20. << company << " shares set to 0. \n";
  21. shares = 0;
  22. }
  23. else
  24. {
  25. shares = n;
  26. }
  27. share_val = pr;
  28. set_tot();
  29. }
  30. //析构函数
  31. Stock::~Stock()
  32. {
  33. std::cout<<"再见了, "<<company<<"!\n";
  34. }
  35. void Stock::buy(long num, double price)
  36. {
  37. if (num < 0)
  38. {
  39. std::cout << "股票购买数量不能是负数。" << "交易被终止了!!\n";
  40. }
  41. else
  42. {
  43. shares += num;
  44. share_val = price;
  45. set_tot();
  46. }
  47. }
  48. void Stock::sell(long num, double price)
  49. {
  50. using std::cout;
  51. if (num < 0)
  52. {
  53. cout << "股票不能卖负数,你脑筋有问题?" << "中断交易了";
  54. }
  55. else if (num>shares)
  56. {
  57. cout << "你自己有几个股票不清楚吗?你能卖比自己持有还多的股票吗?!" << "交易终止!!!";
  58. }
  59. else
  60. {
  61. shares -= num;
  62. share_val = price;
  63. set_tot();
  64. }
  65. }
  66. void Stock::update(double price)
  67. {
  68. share_val = price;
  69. set_tot();
  70. }
  71. void Stock::show()
  72. {
  73. std::cout << "Company: " << company
  74. << " Shares: " << shares << "\n"
  75. << " Share Price: $ " << share_val
  76. << "Total Worth: $" << total_val << "\n";
  77. }

 usestock2.cpp


  
  1. #include <iostream>
  2. #include "stock10.h"
  3. int main()
  4. {
  5. {
  6. using std::cout;
  7. cout<<"Using constructos to create new objects\n";
  8. Stock stock1("NanoSmart",12,20.0);
  9. stock1.show();
  10. Stock stock2=Stock("Boffo Objects",2,2.0);
  11. stock2.show();
  12. cout<<"Assigning stock1 to stock2:\n";
  13. stock2=stock1;
  14. cout<<"显示Stock1 and Stock2\n"\;
  15. stock1.show();
  16. stock2.show();
  17. cout<<"Using a constructor to reset an object\n";
  18. stock1=Stock("Nifty Foods",10,50.0); //临时对象
  19. stock1.show();
  20. cout<<"Done\n";
  21. }
  22. return 0;
  23. }

C++11列表初始化

只要提供与某个构造函数参数列表匹配的,并用大括号括起来就行

Stock hot_tip = { "helwod afhoidf",  100,  56.3 };

Stock jock  = {"dafhdsfsa hiuhfoas"};

Stock temp{};

这三个都是正确的,分别对应:

  Stock(const std::string & co, long n = 0, double pr = 0.0 );
  Stock(const std::string & co, long n = 0, double pr = 0.0 );

    Stock();

const成员函数

 

文章来源: kings.blog.csdn.net,作者:人工智能博士,版权归原作者所有,如需转载,请联系作者。

原文链接:kings.blog.csdn.net/article/details/98593694

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。