从一个例子讲解拷贝构造函数与return
#include "iostream"
using namespace std; class Location
{
public:
Location(int xx = , int yy = )
{
X = xx; Y = yy;
cout << X << "," << Y << " Constructor Object." << endl;
}
Location(const Location & p) //复制构造函数
{
X = p.X + ; Y = p.Y + ; cout << "Copy_constructor called." << endl;
}
~Location()
{
cout << X << "," << Y << " Object destroyed." << endl;
}
int GetX() { return X; } int GetY() { return Y; }
private: int X, Y;
}; //alt + f8 排版
void f(Location p)
{
cout << "Funtion:" << p.GetX() << "," << p.GetY() << endl;
} Location& g()
{
Location A(, );
printf("a = %p\n", &A);
return A;
} void mainobjplay()
{
Location B;
B = g();
printf("b = %p\n", &B);
Location B = g();//不管g()返回的是不是引用,不会单独创建B对象,也不会执行B的构造函数,这句话的意思,用g()的返回(当返回并非是引用时,其实就是匿名对象)来初始化B对象,C++编译直接将匿名对象(返回非引用)变成B,省事,高效.
} void main()
{
mainobjplay();
system("pause");
} 当g()返回的并非是引用时
首先创建B这个对象, 调用B对象的构造函数
然后调用g()函数,跟着创建A对象的函数
重点来了,接下来是return A,
在return A的时候,C++编译器,首先将创建一个匿名对象,然后用A对象去初始化这个匿名对象,这个时候就会调用匿名对象的拷贝构造函数(俗称return副本),接着A析构,g()函数返回
在B接收到g()函数返回的匿名对象之后(=号操作符之后 C++编译器规定),匿名对象析构,最后是B析构. 假设g()返回的是引用,在return A的时候,结果如下
猜测于a是在栈区(临时区),函数返回时要释放掉这块内存,所以a将自己移动到另一块内存区域,不影响编译器回收内存,最后由b来接收.
从一个例子讲解拷贝构造函数与return的更多相关文章
- 一个例子讲解wav头文件 stm32声音程序 录音和播放 wav
下面我们一wav头文件来分析一下: 下面是双声道的,16位,48000采样录的wav文件: 打开属性,能看到的有用信息只有比特率了: 上图的比特率就是 wav头文件里的bitrate: 1536kbp ...
- C++拷贝构造函数(深拷贝,浅拷贝)
对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #i ...
- 【转】C++的拷贝构造函数深度解读,值得一看
建议看原帖 地址:http://blog.csdn.net/lwbeyond/article/details/6202256 一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很 ...
- C++拷贝构造函数(深拷贝,浅拷贝)
http://www.cnblogs.com/BlueTzar/articles/1223313.html 对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; ...
- C++拷贝构造函数详解(转载)
一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员 ...
- 【转】 c++拷贝构造函数(深拷贝,浅拷贝)详解
c++拷贝构造函数(深拷贝,浅拷贝)详解 2013-11-05 20:30:29 分类: C/C++ 原文地址:http://blog.chinaunix.net/uid-28977986-id-3 ...
- [016]转--C++拷贝构造函数详解
一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员 ...
- C++拷贝构造函数详解 转
一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: [c-sharp] view plaincopy int a = 100; int b = a; 而类对象与普通 ...
- c++拷贝构造函数(深拷贝,浅拷贝)详解
一.什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: ; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量. 下面 ...
随机推荐
- json格式的转换为json字符串函数
function toJSON(object){ var type = typeof object; if ('object' == type) { if (Array == object.const ...
- PIC12F629帮我用C语言写个程序,控制三个LED亮灭
http://power.baidu.com/question/240873584599025684.html?entry=browse_difficult PIC12F629帮我用C语言写个程序,控 ...
- Freemarker的初次使用之FTL标签嵌套与map的使用
入职第二周了,在熟悉了公司自动化测试脚本的编写(使用什么数据库,使用哪种语言,框架带了哪些方法)后,现在开始熟悉模拟器,我们把请求发到服务器1,服务器1根据请求参数处理后将结果发给模拟器,模拟器根据服 ...
- Delphi XE5 Android 程序退出功能
Uses FMX.Platform.Android; ... begin {退出程序} MainActivity.finish; end;
- 验证进入AppStore的评分界面
NSString * appstoreUrlString = @"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/view ...
- QT多线程及通过事件进行通信(通过自定义事件,然后QApplication::postEvent给主界面,我之前用的是信号槽)
可以通过QThread实现跨平台的多线程开发,Qt库负责在特定平台上的特定多线程实现.要采用QThread进行多线程开发,首先需要包含头文件: #include <QThread> 然后需 ...
- VB的注释
VB程序中的注解有两种: 第1种是以单引号 ' 开头的,但如果这个符号是在双引号之内的,则视为文本,不做为注释引导符,这个符号后面的内容均为注释内容. 第2种就REM后加注释内容(REM与注释内容要空 ...
- Linux CentOS 编绎安装Python 3.5
Linux CentOS 编绎安装Python 3.5 先决条件(若无安装,则不能编绎使用idle3):yum install tk-devel xz -d Python-3.5.0.tar.xzta ...
- 获取网络状态ios(2G、3G、4G、Wifi)
+(NSString *)getNetWorkStates{UIApplication *app = [UIApplication sharedApplication];NSArray *childr ...
- Swift-09-可空链式调用(Optional Chaining)
我对这个的理解就是:我们有可能会用到其他的属性或者方法,当我们在使用其他的时候,可以使用点语法去访问另一个的属性,这样的使用,就形成了链式访问. 可空链式调用是一种可以请求和调用属性.方法及下表的过程 ...