一、 使用构造函数

**第一种方式:**显式的调用构造函数:

Stock food=Stock{"wordCompany",250,1.25};

**第二种方式:**隐式的调用构造函数

Stock food("wordCompany",250,1.25)

构造函数与new一起用
创建一个stock对象,并初始化,将该对象的地址赋给pstock指针,在这种情况下,该对象没有名称,但是可以使用指针来管理对象

Stock *pstock=new Stock("wordCompany",250,1.25)

**注意:**构造函数的使用方式与其他类成员函数的使用方式不同,
Stock stock1;
其他类成员函数: stock1.show();’
但是使用构造函数只能通过上面显式或者隐式的调用,不能通过对象调用构造函数

二、 默认的构造函数

**默认构造函数:**是在未提供显式初始值时,用来创建对象的初始函数,
使用方法:Stock food; (编译器会隐式调用默认的构造函数)
**注意:**当我们没有定义任何构造函数时,编译器会提供默认构造函数;
但是当我们定义了非默认构造函数之后,编译器将不会再提供默认构造函数(即 Stock food;会出现错误),需要我们再另外定义一个默认的构造函数

定义默认构造函数的方式:

1)给已有的构造函数的参数提供默认值
Stock(const string &co=“erro”,int n=0,double pr=0.0);
2)通过函数重载来定义另一个构造函数

Stock::Stock()
{company="no name";shares=0;share_val=0.0;total_val=0.0;
}

默认构造函数使用

Stock first;     //隐式的调用默认函数
Stock first=Stock();//显示的调用默认函数
Stock *p=new Stock;    //隐式的调用默认函数

三、析构函数

用构造函数创建对象之后,程序负责跟踪该对象,直到其过期为止,对象过期时,程序调用析构函数。
比如,构造函数使用了new来分配内存,那么析构函数就需要使用delete来释放内存。
其实40面向对象这篇博客中,定义的Stock类没有使用new,那么析构函数没有什么需要完成的任务——那么只需要让析构函数生成一个什么都不需要做的隐式析构函数即可(如下所示)析构函数:~Stock(), 没有任何参数

Stock::~Stock()
{}

什么时候调用析构函数?
答:由编译器决定,通常不需要在代码中显示的使用功能析构函数,
如果创建的Stock对象为静态存储类对象,则析构函数在程序运行结束时自动调用;
如果创建的Stock对象为自动存储类对象,则析构函数在程序执行完代码块时自动调用;
如果创建的Stock对象是通过new创建的,那该对象将驻留在栈内存中**(为甚么是栈内存?)**,并且当我们使用delete释放该对象的内存时,析构函数才会自动被调用;

四、例子

//stock.h
#ifndef STACK10_h_
#define STACK10_h_
#include<string>
class Stock
{private:std::string company;long shares;double share_val;double total_val;void set_tot(){ total_val = shares*share_val; }
public:Stock();Stock(const std::string &co, long n = 0, double pr = 0.0);~Stock();void buy(long num, double price);void sell(long num, double price);void update(double price);void show();};
#endif
//stock.cpp
#include<iostream>
#include"stock00.h"
Stock::Stock()
{std::cout << "default constructor called\n";company = "no name ";shares = 0;share_val = 0.0;total_val = 0.0;}Stock::Stock(const std::string &co, long n , double pr)
{std::cout << "constructor using " << co << " called\n";company = co;if (n < 0){std::cout << "number of shares can not be negative"<< company << " shares set to be 0. \n";shares = 0;}elseshares = n;share_val = pr;set_tot();}Stock::~Stock()
{std::cout << "bye, " << company << " !\n";}
void Stock::buy(long num, double price)
{if (num < 0){std::cout << "number of shares can not be negative!.\n"<< "transaction is aborted!" << std::endl;}else{shares+= num;share_val = price;set_tot();}
}void Stock::sell(long num, double price)
{if (num < 0){std::cout << "number of shares can not be negative!.\n"<< "transaction is aborted!" << std::endl;}else if (num>shares){std::cout << "you can not sell more than you have !"<< "transaction is aborted!\n";}else{shares -= num;share_val = price;set_tot();}
}void Stock::update(double price)
{share_val = price;set_tot();
}void Stock::show()
{using std::cout;using std::ios_base;ios_base::fmtflags orig =cout.setf(ios_base::fixed, ios_base::floatfield);std::streamsize prec = cout.precision(3);cout << "company: " << company<< " shares: " << shares << '\n';cout << " shares price :$ " << share_val;cout.precision(2);cout << " total worth :$ " << total_val << '\n';cout << "\n";cout.setf(orig, ios_base::floatfield);cout.precision(prec);
}
//main.cpp
#include<iostream>
#include"stock00.h"
using namespace std;
int main()
{{using std::cout;cout << "using constructors  to create new object \n\n";Stock stock1("Asmart", 12, 20.0);stock1.show();Stock stock2 = Stock("Bsmart", 2, 2.0);//注意这条语句与下面stock1 = Stock("Csmart", 10, 50.0);的区别stock2.show();cout << "assigning stock1 to stock2 :\n\n";stock2 = stock1;stock1.show();stock2.show();cout << "\n";cout << "unsign a constructor to reset an object: \n\n";stock1 = Stock("Csmart", 10, 50.0);//注意stock1对象已经存在,只是重新使用构造函数改变stock1的值stock1.show();cout << "done\n";}system("pause");return 0;
}
//输出结果
using constructors  to create new objectconstructor using Asmart called
company: Asmart shares: 12shares price :$ 20.000 total worth :$ 240.00constructor using Bsmart called
company: Bsmart shares: 2shares price :$ 2.000 total worth :$ 4.00assigning stock1 to stock2 :company: Asmart shares: 12shares price :$ 20.000 total worth :$ 240.00company: Asmart shares: 12shares price :$ 20.000 total worth :$ 240.00unsign a constructor to reset an object:constructor using Csmart called
bye, Csmart !
company: Csmart shares: 10shares price :$ 50.000 total worth :$ 500.00done
bye, Asmart !
bye, Csmart !
请按任意键继续. . .

程序说明:

1)创建stock对象:
第一种方法:

Stock stock1("Asmart", 12, 20.0);

第二种方法:
这里可能会通过调用构造函数来创建一个临时对象,然后将该临时对象复制到stock2中,并丢弃它(即使用析构函数)。)(注意:也有可能不会创建临时对象,视编译器的不同)

Stock stock2 = Stock("Bsmart", 2, 2.0);

2)使用构造函数重新给stock1赋值
这里是通过构造函数创建一个临时对象,然后将内容复制给stock1,随后程序将调用析构函数,以删除临时对象;(在输出结果中可以看到,当把内容复制到stock1之后,调用了析构函数)

cout << "unsign a constructor to reset an object: \n\n";stock1 = Stock("Csmart", 10, 50.0);

补充1:列表初始化

1)上面例子中 类对象的初始化:

Stock stock1("Asmart", 12, 20.0);
或者
Stock stock2 = Stock("Bsmart", 2, 2.0);

2)c++11列表初始化:

Stock stock1={"Asmart", 12, 20.0};
Stock stock1 {"Asmart", 12, 20.0};//等号可以省略
Stock stock {};//使用默认构造函数进行初始化

补充2:const成员函数

下面的代码的第二行是不被编译器允许的,因为show()的代码无法保证调用对象land不被修改。我们之前通过将函数形参声明为const引用或者const指针,来解决这种问题。
但是这里show()没有形参,

const Stock land=Stock("kevin",20,12.0);
land.show();

解决办法:

void show() const;//函数声明void Stock::show() const//函数定义
{...
}

41-构造函数/析构函数相关推荐

  1. C++派生类含有成员对象构造函数析构函数顺序

    参考博客:传送门1 当类中含有对象成员时: 类的构造函数要包含对成员对象的初始化,如果构造函数的成员初始化列表没有包含对成员对象的初始化,系统会自动调用成员对象的无参构造函数.顺序上:先调用成员对象的 ...

  2. C++构造函数/析构函数 设置成private的原因

    C++构造函数/析构函数 设置成private的原因 标签(空格分隔): c/c++ 将构造函数,析构函数声明为私有和保护的,那么对象如何创建? 已经不能从外部调用构造函数了,但是对象必须被构造,应该 ...

  3. 在构造函数/析构函数中调用virtual函数带来的影响

    在构造函数/析构函数中调用virtual函数,那么调用的一定是本类中的virtual函数. 先看一段代码: #include<iostream>class Base { public:Ba ...

  4. C++反汇编第一讲,认识构造函数,析构函数,以及成员函数

    C++反汇编第一讲,认识构造函数,析构函数,以及成员函数 以前说过在C系列下的汇编,怎么认识函数.那么现在是C++了,隐含有构造和析构函数 一丶认识构造函数 高级代码: class MyTest { ...

  5. C++ 构造函数 析构函数

    C++ 构造函数 构造函数 默认构造函数 有参构造函数 析构函数 析构函数例子 析构函数执行时机 局部对象 全局对象 构造函数 构造函数 (constructor) 是一种特殊的成员函数. 它会在每次 ...

  6. c++ 构造函数析构函数 数据安全_C++知识点 16:构造函数和析构函数的语法

    #define _CRT_SECURE_NO_WARNINGS #include using namespace std;// 创建一个类( 类内包括: 2个构造函数,一个析构函数) class Pe ...

  7. C++——构造函数析构函数

    目录 类的构造函数 普通构造函数 带参数的构造函数 初始化列表来初始化字段 类的析构函数 类的构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行. 构造函数的名称与类的名称 ...

  8. c++远征之继承篇——继承的概念、继承时构造函数/析构函数的先后顺序

    1.继承的概念 2.继承中,构造函数和析构函数的先后顺序

  9. PHP面向对象构造函数,析构函数

    构造函数 用来生成对象的函数 <body> <?php class Ren{ public $name;//姓名 public $sex;//性别 性别是人一出生就知道的,可以用构造 ...

  10. 类和对象编程(三):构造函数析构函数

    类的构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行. 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void.构造函数可用于为某些成员变量设置 ...

最新文章

  1. 结婚率连7年下降,数据揭秘单身背后复杂逻辑
  2. 科大星云诗社动态20210212
  3. elasticsearch mongodb mysql_Elasticsearch 与 Mongodb 数据同步问题
  4. python 菜鸟:返回值_Python中的真实值和虚假值:详细介绍
  5. 如何写一个不带BOM的UTF8文件
  6. Going to 的将来时态_47
  7. bigdecimal 怎么做除法_面向对象之BigDecimal
  8. 【android】安卓高仿京东分类页
  9. Mitre SFR 1.4在Windows上用Visual Studio2013 成功运行 及详解
  10. draw.io 二次开发(idea2020) 系列(三)
  11. 常见HTML符号转换整理
  12. 搭建vpn linux,vpn在linux下搭建
  13. 虚幻引擎4中的实时GI技术
  14. 关于gb2312编码的xml解析
  15. Python-OpenCV棋盘检测
  16. Unity DOTS 学习笔记2 - 面向数据设计的基本概念(上)
  17. 2019年团体程序设计天梯赛总结
  18. 2021年Java高级面试题总结
  19. blazor+localstorage
  20. PointRend相关论文集

热门文章

  1. 计算机公司职业体验报告高中,高中生寒假社会实践职业体验感悟
  2. Vue中从v-model,model,.sync到双向数据传递,再到双向数据绑定
  3. 2021-2022-1 ACM集训队每周程序设计竞赛(5) - 问题 B: 跳蛙 - 题解
  4. H5缓存机制浅析-移动端Web加载性能优化【干货】
  5. 权值衰减和 L2 正则化傻傻分不清楚?
  6. 一起做RGB-DSLAM(7)
  7. 合工大c语言课后作业,填空类 合工大C语言题库
  8. 大三学生——要不要上研究生?
  9. 什么是强化学习,强化学习在控制系统中的应用以及matlab强化学习工具箱的介绍
  10. VC++6.0报错: include stdafx.h before including this file for PCH