标签:情况下 区别 创建 poi 浅拷贝 blog 另一个 系统 art
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;
}
标签:情况下 区别 创建 poi 浅拷贝 blog 另一个 系统 art
原文地址:https://www.cnblogs.com/yyzyxy/p/9736141.html