1. 程式人生 > >c++的復制構造函數,(鄭莉 c++語言程序設計)

c++的復制構造函數,(鄭莉 c++語言程序設計)

三次 返回值 參數 .html article 構造 局部變量 class html

1.

https://www.cnblogs.com/BlueTzar/articles/1223313.html

以上博客講了深拷貝和淺拷貝的區別,即:

在某些狀況下,類內成員變量需要動態開辟堆內存,這時實行拷貝

B=A;

A的成員指針變量有指向內存,這時復制構造函數會將B的也指向同一塊內存,A銷毀(比如析構)時,B裏面的成員變量就成了野指針。所以默認的復制構造函數是不行的。這時就需要深拷貝。

2.何種情況下自動調用復制構造函數

1)對象以值的形式傳遞到函數時

2)對象以值的形式作為函數的返回值時

3)對象需以另一個對象進行初始化時,

// 4_2.cpp: 定義控制臺應用程序的入口點。
//學習賦值構造函數的使用。有三種場景
//1.對象復制時
//2.函數的參數是對象,且是以值傳遞的形式時。
//3.函數的返回值是對象。

#include "stdafx.h"
#include <iostream>
using namespace std;
class Point
{
public:
Point(int gX=1,int gY=2)//將此構造函數構造成內聯構造函數
{
x = gX;
y = gY;
}
Point(Point &a);
int getX();
int getY();
private:
int x, y;
};

Point::Point(Point &a)
{
x = a.x+10;
y = a.y;
cout << "haha" << endl;
};
int Point::getX()
{
return x;
}
int Point::getY()
{
return y;
}

//定義一個普通函數
void func1(Point p)
{
cout << "func1‘s is " << p.getX() << endl;
}

//定義一個有返回值的函數
Point func2()
{
Point p(3, 4);
return p;//p是局部變量,調用結束就銷毀。編譯系統會創建一個臨時對象,執行return時會調用復制構造函數a的值復制到臨時對象去
}

int main()
{
Point p1;
//cout << "p1x is: " << p1.getX() << " yis: " << p1.getY() << endl;//1 2
Point p2 = p1;
cout << "p2_x1 is: " << p2.getX() << " yis: " << p2.getY() << endl;//11 2//第一次調用復制,加了10
p2 = func2();
cout << "p2_x2 is: " << p2.getX() << " yis: " << p2.getY() << endl;//13 4//第二次調用復制,p2被重新賦值
func1(p2); // 23//第三次,值傳遞形式拷貝對象,故會再次調用,得到的是p的x值,跟p2沒什麽關系。
cout << "p2_x3 is: " << p2.getX() << " yis: " << p2.getY() << endl;//13 4
system("pause");
return 0;
}

c++的復制構造函數,(鄭莉 c++語言程序設計)