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;
}

 

posted on 2018-10-01 23:48  yyzyyx  阅读(167)  评论(0编辑  收藏  举报