c++中构造函数 、析构函数的作用域详解
我们知道,在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调用传递的是引用时,此时结果为
,不会调用复制构造函数。当改为值传递后,复制构造函数又被重新调用,

c++中构造函数 、析构函数的作用域详解的更多相关文章
- Python中的变量和作用域详解
Python中的变量和作用域详解 python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部 ...
- javascript中的this作用域详解
javascript中的this作用域详解 Javascript中this的指向一直是困扰我很久的问题,在使用中出错的机率也非常大.在面向对象语言中,它代表了当前对象的一个引用,而在js中却经常让我觉 ...
- 【转】 c++拷贝构造函数(深拷贝,浅拷贝)详解
c++拷贝构造函数(深拷贝,浅拷贝)详解 2013-11-05 20:30:29 分类: C/C++ 原文地址:http://blog.chinaunix.net/uid-28977986-id-3 ...
- 【C++】拷贝构造函数(深拷贝,浅拷贝)详解
一.什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: ; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量. 下面看一个类对 ...
- Delphi中的线程类 - TThread详解
Delphi中的线程类 - TThread详解 2011年06月27日 星期一 20:28 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本 ...
- PHP 中 16 个魔术方法详解
PHP 中 16 个魔术方法详解 前言 PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __constru ...
- PHP常量、变量作用域详解(一)
PHP 中的每个变量都有一个针对它的作用域,它是指可以在其中访问变量(从而访问它的值)的一个领域.对于初学者来说,变量的作用域是它们所驻留的页面.因此, 如果你定义了 $var,页面余下部分就可以访问 ...
- PHP变量作用域详解(二)
学过C的人用PHP的时候一般会相当顺手,而且感到PHP太方便太轻松.但在变量作用域这方面却与C有不同的地方,搞不好会相当郁闷,就找不到错误所在.昨晚就与到这么一个问题,是全局变量在函数中的问题.今天搜 ...
- Java基础-变量的定义以及作用域详解
Java基础-变量的定义以及作用域详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字面量 常量(字面量)表示不能改变的数值(程序中直接出现的值).字面量有时也称为直接量,包 ...
随机推荐
- LeetCode——Two Sum
Given an array of integers, find two numbers such that they add up to a specific target number. The ...
- 解读sample4
说明 被测试代码文件 sample4.h.sample4.cc 测试代码文件 sample4_unittest.cc 官网上如是描述sample4: Sample #4 is another basi ...
- HPROF学习
抓取HPROF log 1. GUI 可以通过 adt-bundle-windows-x86_64-20140702\sdk\tools\monitor.bat来抓取. 打开软件,选中相应的包,比如“ ...
- K - Leapin' Lizards - HDU 2732(最大流)
题意:在一个迷宫里面有一些蜥蜴,这个迷宫有一些柱子组成的,并且这些柱子都有一个耐久值,每当一只蜥蜴跳过耐久值就会减一,当耐久值为0的时候这个柱子就不能使用了,每个蜥蜴都有一个最大跳跃值d,现在想知道有 ...
- Hotel - poj 3667(求连续子区间)
题意:有两种操作 1,从左往右找一个区间是 D 的连续序列,然后覆盖,返回区间最前面的数,如果没有输出0 2, 释放从L开始连续D的区间 分析:就是从左往右查找一个D的连续区间,可以使用三个值操作ls ...
- Foundation: Binary Search
/* Binary search. * * Implementation history: * 2013-10-5, Mars Fu, first version. */ /* [Binary Sea ...
- java中的接口和抽象类是什么?
抽象类与接口的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力.abstract c ...
- OperationalError:(1054 - "Unknown column 'game.lable1' in 'field list' ")解决办法
今天白天遇到一个错误,第一次遇到这样的问题,数据库的问题,百度了很多答案也找了很多博客文章看 问题:OperationalError:(1054 - "Unknown column 'gam ...
- 安装redis,含安装步骤和安装中出现的详细错误分析
1.wget http://download.redis.io/releases/redis-2.8.13.tar.gz 2.解压文件 tar -zxvf redis-2.8.13.tar.gz 3. ...
- 关于PHP的curl开启问题 (转)
今天在做一个新浪登录功能,新浪提供的PHP SDK里需要用到curl_init()函数,在调试的时候报找不到curl_init()的方法. 经搜索得知需要开启curl的php扩展,那curl又是什么呢 ...