zoukankan      html  css  js  c++  java
  • 从一个例子讲解拷贝构造函数与return

     1 #include "iostream"
     2 using namespace std;
     3 
     4 
     5 class Location
     6 {
     7 public:
     8     Location(int xx = 0, int yy = 0)
     9     {
    10         X = xx;  Y = yy; 
    11         cout << X << "," << Y << " Constructor Object." << endl;
    12     }
    13     Location(const Location & p)         //复制构造函数
    14     {
    15         X = p.X + 10;  Y = p.Y + 10;   cout << "Copy_constructor called." << endl;
    16     }
    17     ~Location()
    18     {
    19         cout << X << "," << Y << " Object destroyed." << endl;
    20     }
    21     int  GetX() { return X; }        int GetY() { return Y; }
    22 private:   int  X, Y;
    23 };
    24 
    25 //alt + f8 排版
    26 void f(Location  p)
    27 {
    28     cout << "Funtion:" << p.GetX() << "," << p.GetY() << endl;
    29 }
    30 
    31 Location& g()
    32 {
    33     Location A(1, 2);
        printf("a = %p ", &A);
    34 return A; 35 } 36 37 void mainobjplay() 38 { 39 Location B; 40 B = g();
    printf("b = %p ", &B);
    Location B = g();//不管g()返回的是不是引用,不会单独创建B对象,也不会执行B的构造函数,这句话的意思,用g()的返回(当返回并非是引用时,其实就是匿名对象)来初始化B对象,C++编译直接将匿名对象(返回非引用)变成B,省事,高效.
    41 } 42 43 void main() 44 { 45 mainobjplay(); 46 system("pause"); 47 }

    当g()返回的并非是引用时
    首先创建B这个对象, 调用B对象的构造函数
    然后调用g()函数,跟着创建A对象的函数
    重点来了,接下来是return A,
    在return A的时候,C++编译器,首先将创建一个匿名对象,然后用A对象去初始化这个匿名对象,这个时候就会调用匿名对象的拷贝构造函数(俗称return副本),接着A析构,g()函数返回
    在B接收到g()函数返回的匿名对象之后(=号操作符之后 C++编译器规定),匿名对象析构,最后是B析构.



    假设g()返回的是引用,在return A的时候,结果如下

    猜测于a是在栈区(临时区),函数返回时要释放掉这块内存,所以a将自己移动到另一块内存区域,不影响编译器回收内存,最后由b来接收.




  • 相关阅读:
    微服务架构技术栈选型手册(万字长文)
    Visual Studio 2013 always switches source control plugin to Git and disconnect TFS
    Visual Studio 2013 always switches source control plugin to Git and disconnect TFS
    MFC对话框中使用CHtmlEditCtrl
    ATL开发 ActiveX控件的 inf文件模板
    ActiveX: 如何用.inf和.ocx文件生成cab文件
    Xslt 1.0中使用Array
    如何分隔两个base64字符串?
    An attempt was made to load a program with an incorrect format
    JQuery 公网 CDN
  • 原文地址:https://www.cnblogs.com/c-slmax/p/5182800.html
Copyright © 2011-2022 走看看