我们知道,在c++中,析构函数是在函数作用域尾部执行析构函数,从而释放对象,但是有一种情况下,析构函数作用域发生变化,请看下面的例子,定义了一个Stock类,Stock类存放在stock.h中,主调用函数在stock.cpp中。

  stock.h  

 #include <iostream>
#include <string.h>
class Stock{
private:
char m_company[];
int m_stock_num;
float m_stock_price;
float total_price;
float stock_sum(){total_price= m_stock_num*m_stock_price;} public:
int get_stock(char *company,int stock_num,float stock_price);
void increase(int num,float price);
void sell(int num,float price);
void update_price(float price);
void print_stock_info();
friend Stock plus1(int stock_num,Stock t);
Stock operator+(Stock t);
Stock(char *p,int num,float price);
Stock();
~Stock();
}; Stock::Stock(char *company,int stock_num,float stock_price)
{
int len=strlen(company);
strncpy(m_company,company,len+);
m_stock_num=stock_num;
m_stock_price=stock_price;
stock_sum(); } Stock::Stock()
{
m_stock_num=;
m_stock_price=;
stock_sum();
std::cout<<"hello boy"<<std::endl;
} Stock::~Stock()
{
std::cout<<"good bye"<<std::endl; } Stock plus1(int stock_num,Stock t)
{
Stock total;
total.m_stock_num=stock_num+t.m_stock_num;
return total; } inline Stock Stock::operator+(Stock t)
{
Stock total;
total.m_stock_num=m_stock_num+t.m_stock_num;
total.total_price=total_price+t.total_price;
return total;
} inline int Stock::get_stock(char * company,int stock_num,float stock_price)
{
int len=strlen(company);
if (len>)
return false;
strncpy(m_company,company,len+);
m_stock_num=stock_num;
m_stock_price=stock_price;
stock_sum();
return true;
} void Stock::increase(int num,float price)
{
m_stock_num=m_stock_num+num;
m_stock_price=price;
stock_sum();
} void Stock::sell(int num,float price)
{
if(num>m_stock_num)
m_stock_num=;
else
m_stock_num=m_stock_num-num; m_stock_price=price;
stock_sum();
}
void Stock::update_price(float price)
{
m_stock_price=price; }
void Stock::print_stock_info()
{
std::cout<<m_stock_num<<std::endl;
std::cout<<total_price<<std::endl;
}

  stock.cpp  

 #include "stock.h"
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char *p;
p=new char[];
strcpy(p,"baidu");
Stock object[];
object[0].get_stock(p,100,2.3);
object[1].get_stock(p,100,2.3);
object[2]=object[0]+object[1];
object[2].print_stock_info();
object[]=plus1(,object[]);
object[].print_stock_info();
return true; }

  可以看到我们声明友元函数plus1后,将object[2]对象通过构造函数传递到友元中,此时友元函数中先调用拷贝构造函数接受参数,然后调用 默认构造函数形成局部total对象,在我们完成加的动作之后,对象要返回,此时调用析构函数,但若此时我们采用引用的返回值方式 Stock &plus1(int stock_num,Stock t) ,调用同样成功,但对象被销毁了,为什么还可以被引用  而继续使用。我们来看一下两种返回方式的结果:

  返回对象,

返回对象引用,

  此时编译器应该是做过优化,因为函数的作用域结尾处,应该调用过析构函数了(从图中可以看出来,调用了5次构造函数,6次析构函数,有一次复制构造函数),所以析构 函数肯定是被执行了,但是编译器作过优化处理,使得对象依旧可以被传递,此时编译器会给出警告提示。但是在1个函数中,我们可以返回1个在函数调用结束不会被释放的对象的引用。比如外部传入的对象,比如函数所属类的成员变量等。而返回局部变量(对象引用)是很危险的,但是返回对象则是可以的,因为返因对象时会调用复制构造函数、然后才是析构函数。如果我们plus1调用传递的是引用时,此时结果为

,不会调用复制构造函数。当改为值传递后,复制构造函数又被重新调用,

最新文章

  1. Java Web总结
  2. Theano入门神经网络(二) 实现一个XOR门
  3. 试用vSphere 6(三):安装vCenter 6(独立数据库)之:vCenter安装与配置
  4. 使用MarkdonPad2学习心得
  5. 关于js函数中的异步编程
  6. Ngrok 内网穿透利器
  7. Ubuntu实用快捷键
  8. 配置 dovecat 的 log
  9. 那些年被我坑过的Python——不得不知(第二章)
  10. Spring 之 注解实现返回json
  11. fatal error LNK1112: module machine type &#39;X86&#39; conflicts with target machine type &#39;x64&#39;
  12. Springmvc中配置Quartz使用,实现任务实时调度。
  13. Frogger POJ - 2253
  14. [源码分析]读写锁ReentrantReadWriteLock
  15. 修复Microsoft Store 无法连接网络 代码: 0x80072EFD
  16. QTP 自动货测试桌面程序-笔记 (单据-下拉框选择、对话框 、菜单)
  17. 飞鹅云打印 API_C#
  18. java中避免乱码
  19. ssh 通过跳板机连接到远程服务器
  20. xss 防止攻击,恶意用户将输入的信息当成html或js代码执行,办法是将用户输入的信息改为text格式,或特殊符号转义

热门文章

  1. Visual studio 能否定位打开文件在项目中的位置
  2. MYSQL转MSSQL
  3. Jquery中常见问题
  4. 剑指offer---3
  5. java笔记11之二维数组
  6. 使用javascript判断浏览器类型
  7. Swift optional详解
  8. Linux/UNIX套接字连接
  9. 奇妙的go语言(网页下载)
  10. Sorting File Contents and Output with sort