经过 C++ Primer Plus 上的实验发现:对象操作是一个栈的机制。

先被创建的对象,后被释放,而对一个已经具体化的对象进行的任何改变,都会导致旧对象的消亡。

执行的顺序是先构造,再复制,最后析构。令我印象深刻的一例子:

stock10.h

#ifndef STOCK10_H_
#define STOCK10_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

stock10.cpp

#include <iostream>
#include "stock10.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't be negative; "<< company << " shares set to 0.\n";shares = 0;}elseshares = n;share_val = pr;set_tot();
}Stock::~Stock()
{std::cout << "Bye, " << company << std::endl;
}void Stock::sell(long num, double price)
{if (num < 0){std::cout << "Number of shares purchased can't be negative. "<< "Transaction is aborted.\n";}else if (num > shares){std::cout << "You can't sell more than you have! "<< "Transaction is aborted.\n";}else{shares -= num;share_val = price;set_tot();}
}void Stock::buy(long num, double price)
{if (num < 0){std::cout << "Number of shares purchased can't be negative. "<< "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 类, 控制输出格式// ios_base::fixed 正常方式输出浮点数// ios_base::floatfield 保留 6 位小数 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 << "  Share Price: $" << share_val;cout.precision(2);cout << "  Total Worth: $" << total_val << '\n';cout.setf(orig, ios_base::floatfield);cout.precision(prec);
}

usestock2.cpp

// 对象操作是一个栈的机制
// 先被创建的对象,后被释放
// 而对一个已经具体化的对象进行的任何改变,都会导致旧对象的消亡
// 执行的顺序是先构造,再赋值,最后再析构。
#include <iostream>
#include "stock10.h"int main()
{{using std::cout;cout << "Using constructors to create new objects\n";Stock stock1("NanoSmart", 12, 12.0);stock1.show();Stock stock2 = Stock("Boffo Objects", 2, 2.0);stock2.show();cout << "Assigning stock1 to stock2:\n";stock2 = stock1; // 只有在创建的时候才会调用 Stock 构造函数cout << "Listing stock1 and stock2:\n";stock1.show();stock2.show();cout << "Using a constructor to reset an object\n";stock1 = Stock("Nifty Foods", 10, 50.0);// 首先调用 Stock 函数创建 Stock 类,然后赋值给 stock1// 这时,由于 stock1 已经消亡了,所以调用析构函数 ~Stockcout << "Revised stock1:\n";stock1.show();cout << "Done\n";}return 0;
}

首先 stock1 对象被创建,然后显示出来,stock2重复同样的操作,而 stock2 = stock1,对象虽然被改变,但不会调用析构和构造函数。也就是说只有显式的进行创建或改变,才会调用构造函数,而析构函数应是在旧的对象消亡时,才会被调用。普通的赋值则不会调用析构函数。

我们先创建的 stock1,再创建的stock2,而最后输出的结果却是,先输出 stock2,再输出 stock1,这说明对象的存储也同样是栈的机制,与普通的变量是一种模式。

C++笔记 对象的创建与消亡相关推荐

  1. Effect Java 学习笔记-对象的创建与销毁

    第一条.静态工厂替代构造器 1.更高的可读性,可命名. 2.可以控制对象的数量,统一入口生成,单例.对象重用 3.获取对象更加灵活,可以返回对象的所有子类 通过静态类暴露API,可以隐藏API实现类, ...

  2. javascript笔记:深入分析javascript里对象的创建(上)续篇

    今天回来一看我的博客居然有这么多人推荐真是开心极了,看来大家对我的研究有了认可,写博客的动力越来越大了,而且我发现写javascript在博客园里比较受欢迎,写java的受众似乎少多了,可能博客园里j ...

  3. java日常笔记、对象的创建完全是由构造方法实现的吗?this的本质

    java日常笔记.对象的创建完全是由构造方法实现的吗 不完全是构造方法是创建java对象重要途径,通过new关键字调用构造器时,构造器也确实返 回了该对象,但这个对象并不是完全由构造器负责创建的,创建 ...

  4. 接收list对象_PyTorch入门视频笔记从数组、列表对象中创建Tensor

    关注"AI机器学习与深度学习算法"公众号选择"星标"公众号,原创干货,第一时间送达 从数组.列表对象创建 Numpy Array 数组和 Python List ...

  5. Java 虚拟机学习笔记 | 类加载过程和对象的创建流程

    前言 创建对象是 Java 语言绕不开的话题,那么对象是如何创建出来的呢?我们今天就来聊一聊.对象创建第一步就是检查类是否加载,而类的加载又牵扯到类的加载过程.如果单说对象的创建而绕开类的加载过程,感 ...

  6. pytorch list转tensor_PyTorch入门视频笔记从数组、列表对象中创建Tensor

    关注"AI机器学习与深度学习算法"公众号选择"星标"公众号,原创干货,第一时间送达 从数组.列表对象创建 Numpy Array 数组和 Python List ...

  7. Effective Java读书笔记三:创建和销毁对象

    第1条:考虑用静态工厂方法代替构造器 对于类而言,为了让客服端获得它的一个实例最常用的的一个方法就是提供一个公有的构造器.还有一种方法,类可以提供一个公有的静态工厂方法(static factory ...

  8. 《Effective Java》学习笔记 第二章 创建和销毁对象

    第二章 创建和销毁对象 何时以及如何创建对象,何时以及如何避免创建对象,如何确保他们能够适时地销毁,以及如何管理对象销毁之前必须进行的各种清理动作. 1 考虑用静态工厂方法代替构造器 一般在某处获取一 ...

  9. java编程思想读书笔记二(对象的创建)

    有兴趣的同学可以移步笔者的个人博客 更多博客 java对象 对象的创建 java的对象是在运行时创建的,创建对象的的触发条件有以下几种: 用new语句创建对象,这是最常用的创建对象方法. 运用反射手段 ...

最新文章

  1. 数据特征分析(学习笔记)
  2. docker命令的组合使用
  3. Servlet(自己实现的Servlet)细节
  4. 使用TorchElastic训练DeepSpeech
  5. 科创板注册获批,优刻得将成为“公有云第一股”
  6. 信息学奥赛一本通(1407:笨小猴)
  7. youleb多风格响应式博客wordpress主题模板
  8. python collections 模块中的 deque
  9. 存储过程批量执行脚本
  10. cownew开源-eclipse插件开发学习知识点笔记
  11. 小程序自定义tabbar custom-tab-bar 6s出不来解决方案,cover-view不兼容
  12. IDEA 忽略CSS错误
  13. CentOS7网络配置ping通外网
  14. 重新启用ClustrMaps记数
  15. Hyperledger Fabric 网络搭建详解
  16. [导入]锐道dorado
  17. 【转】无人机故障数据集ALFA: A Dataset for UAV Fault and Anomaly Detection
  18. 非科班小硕的算法秋招记录
  19. XYNUOJ-2139 德莱联盟
  20. 【Photoshop CS5永久序列号】一次输入永久使用

热门文章

  1. 中国 Azure 应用程序的开发人员注意事项
  2. etcdctl cluster-health 出现 cluster may be unhealthy: failed to list members
  3. spring简介和maven的简单介绍
  4. 【蓝牙学习笔记二】初识BLE蓝牙协议栈
  5. Dart 语言学习笔记(Dart语言完全指南)
  6. ansys workbench 静力结构分析 基础操作流程(入门)
  7. 好看的css阴影效果
  8. Matlab自适应均线_用MATLAB求移动平均线,不用MOVAVG函数,求MA5,MA10 – MATLAB中文论坛...
  9. 数据库第六章总结 创建与使用存储过程
  10. QT绘图常用功能 Trick: QT带背景图和文字的QPushButton制作