从一个例子讲解拷贝构造函数与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\n", &A);
34     return A;
35 }
36
37 void mainobjplay()
38 {
39     Location B;
40     B = g();       printf("b = %p\n", &B);       Location B = g();//不会单独创建B对象,也不会执行B的构造函数,这句话的意思,用g()的返回(其实就是匿名对象)来初始化B对象,C++编译直接将匿名对象变成B,省事,高效.
41 }
42
43 void main()
44 {
45     mainobjplay();
46     system("pause");
47 }

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

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

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

从一个例子讲解拷贝构造函数与return的相关文章

【转载】C++拷贝构造函数(深拷贝,浅拷贝)

对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #include <iostream>using namespace std;class CExample {private:     int a;public:     CExample(int b)     { a=b;}     void Show ()     {        cout<

C++拷贝构造函数(深拷贝,浅拷贝)

http://www.cnblogs.com/BlueTzar/articles/1223313.html 对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. 1 #include <iostream> 2 using namespace std; 3 4 class CExample { 5 private: 6 int a; 7 public: 8

拷贝构造函数和赋值操作符

假设有一个如下的MyClass类: class MyClass { public: //构造函数 //拷贝构造函数 MyClass(const MyClass& that) : int_data_(that.int_data_), dbl_data_(that.dbl_data_), str_data_(that.str_data_) { } //赋值操作符 MyClass& operator = (const MyClass& that) { if(this != that) {

C++拷贝构造函数(浅拷贝、深拷贝)

下面举一个简单的例子说明对象之间的拷贝(此例中没有自定义拷贝构造函数,在调用拷贝构造函数的时候,编译器会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝)浅拷贝: #include<iostream> using namespace std; class CExample { private:int a; public: CExample(int b) { a=b; } void Show() { cout<<a<<endl; } }; int main(

【转】 c++拷贝构造函数(深拷贝,浅拷贝)详解

c++拷贝构造函数(深拷贝,浅拷贝)详解 2013-11-05 20:30:29 分类: C/C++ 原文地址:http://blog.chinaunix.net/uid-28977986-id-3977861.html 一.什么是拷贝构造函数      首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=100; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.  下面看一个类对象拷贝的简单例子. #include<iostream

c++拷贝构造函数(深拷贝,浅拷贝)详解

一.什么是拷贝构造函数      首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=100; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.  下面看一个类对象拷贝的简单例子. #include<iostream> using namespace std; class CExample { private: int a; public: //构造函数 CExample(int b) { a=b; printf("con

C++类对象的复制-拷贝构造函数

在学习这一章内容前我们已经学习过了类的构造函数和析构函数的相关知识,对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10; int b =a; 自己定义的类的对象同样是对象,谁也不能阻止我们用以下的方式进行复制,例如: #include <iostream>  using namespace std;    class Test  {  public:      Test(int temp)      {          p1=temp;      }  prote

C++拷贝构造函数

在C++中,下面三种对象需要调用拷贝构造函数!1. 对象以值传递的方式传入函数参数 [c-sharp] view plaincopy class CExample    {   private:    int a;      public:    //构造函数    CExample(int b)    {      a = b;     cout<<"creat: "<<a<<endl;    }       //拷贝构造    CExample(

Copy constructor拷贝构造函数

翻译的是wikipedia关于copy constructor,地址:点击打开链接 拷贝构造函数是C++语言中用一个已有对象创建一个新对象的特殊构造函数,该函数的第一个参数必须是函数所在类型的引用(译注:const/non-const都可以,可以有多个参数剩余参数必须有默认值,一定要是引用,这些原因见后,问:有多个参数拷贝构造如何调用?). 通常编译器会自动为每一个class创建一个拷贝构造函数(显示拷贝构造);有些情况下程序员自定义了拷贝构造函数(用户自定义拷贝构造),这时编译器不合成拷贝构造