CopyConstructor.cppRUN

//拷贝构造函数的用法
#include <iostream>

class Vector
{
private:
	int x, y;
public:
	Vector()//不带参数的普通构造函数
	{
		x = 0; 
		y = 0;
		std::cout << "Constructor\n";
	}
	
	Vector(int x, int y)//不带参数的普通构造函数
	{
		this->x = x;
		this->y = y;
		std::cout << "Constructor 2\n";
	}

	Vector(const Vector & v)//拷贝构造函数
	{
		x = v.x;
		y = v.y;
		std::cout << "Copy Constructor\n";
	}

	Vector & operator= (const Vector & v)//赋值函数
	{
		std::cout << "operator=\n";

		x = v.x;
		y = v.y;

		return *this;
	}

	int X()const { return x; } //const函数,说明该函数不会修改数据成员的值
	int Y()const { return y; } //const函数,说明该函数不会修改数据成员的值
};

void FunByValue(Vector v)
{//v的值,通过拷贝构造函数得到
	std::cout << v.X() << std::endl;
}

void FunByRef(const Vector & v)
{//v,就是实参,引用,其实就是别名
	std::cout << v.X() << std::endl;
}

Vector CreateVector(int x, int y)
{//返回值以拷贝构造函数的形式返回
//但是,Microsoft C++(返回值出现拷贝构造函数调用)和GCC(没有)表现不一致

	Vector v(x, y);
	return v;
}

int main()
{
	Vector v1, v2(1,2);//构造函数

	Vector v3(v2);//拷贝构造函数
	Vector v4 = v2;//拷贝构造函数,不是赋值,v4创建并且初值
	v4 = v2;// 现在是赋值运算符了,因为v4已经存在


	//函数(按值)参数传递,出现拷贝构造函数调用
	FunByValue(v4);

	//引用方式调用,什么都不发生
	FunByRef(v4);

	std::cout << "CreateVector\n";
	//函数值返回,Microsoft C++(返回值出现拷贝构造函数调用)和GCC(没有)表现不一致
	Vector  v5 = CreateVector(3, 4);
	
	return 0;
}