新手学C++遇如下问题求教

「已注销」 2016-07-21 11:07:16
如图所示,程序执行的结果是13A23B,一直不明白为什么会有3,为什么执行了拷贝类那个函数,由于是新手懂的不多,请懂的大神不吝赐教一点儿,谢谢。
...全文
76 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灸舞 2016-07-21
  • 打赏
  • 举报
回复
拷贝构造函数的调用时机: 1、对象以值传递的方式传入函数参数 2、对象以值传递的方式从函数返回 3、对象需要通过另外一个对象进行初始化

#include <iostream>  
using namespace std;

class Point
{
public:
	Point(int xx = 0, int yy = 0)
	{
		X = xx;
		Y = yy;
	}
	Point(Point& p);
	int GetX() { return X; }
	int GetY() { return Y; }
private:
	int X, Y;
	static int count;
};

Point::Point(Point &p)
{
	X = p.X;
	Y = p.Y;
	count++;
	cout << "拷贝构造函数被调用, " << "count:" << count << endl;
}

void fun1(Point p)
{
	cout << p.GetX() << endl;
}

Point fun2()
{
	Point A(3, 4);
	//调用拷贝构造函数  
	return A;
}


int Point::count = 0;

void main(void)
{
	Point A(1, 2);
	// 当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷贝赋值。  
	Point B(A); //拷贝构造函数被调用  
	cout << B.GetX() << endl;

	// 若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数  
	fun1(A); //调用拷贝构造函数  

	// 当函数的返回值是类对象时,系统自动调用拷贝构造函数。  
	B = fun2();
	cout << B.GetX() << endl;

	// 调用2次拷贝构造函数,第一处是在fun2()中的return A,第二处是将fun2的返回值初始化引用ref时。  
	Point & ref = fun2();
	cout << ref.GetX() << endl;

}
「已注销」 2016-07-21
  • 打赏
  • 举报
回复
引用 1 楼 小灸舞的回复:
拷贝构造函数的调用时机: 1、对象以值传递的方式传入函数参数 2、对象以值传递的方式从函数返回 3、对象需要通过另外一个对象进行初始化

#include <iostream>  
using namespace std;

class Point
{
public:
	Point(int xx = 0, int yy = 0)
	{
		X = xx;
		Y = yy;
	}
	Point(Point& p);
	int GetX() { return X; }
	int GetY() { return Y; }
private:
	int X, Y;
	static int count;
};

Point::Point(Point &p)
{
	X = p.X;
	Y = p.Y;
	count++;
	cout << "拷贝构造函数被调用, " << "count:" << count << endl;
}

void fun1(Point p)
{
	cout << p.GetX() << endl;
}

Point fun2()
{
	Point A(3, 4);
	//调用拷贝构造函数  
	return A;
}


int Point::count = 0;

void main(void)
{
	Point A(1, 2);
	// 当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷贝赋值。  
	Point B(A); //拷贝构造函数被调用  
	cout << B.GetX() << endl;

	// 若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数  
	fun1(A); //调用拷贝构造函数  

	// 当函数的返回值是类对象时,系统自动调用拷贝构造函数。  
	B = fun2();
	cout << B.GetX() << endl;

	// 调用2次拷贝构造函数,第一处是在fun2()中的return A,第二处是将fun2的返回值初始化引用ref时。  
	Point & ref = fun2();
	cout << ref.GetX() << endl;

}
您好,按您的意思,Point &ref=fun2()这句调用了2次拷贝构造函数,那整个程序应该是执行了5次拷贝构造函数,但实际执行的时候只有4次,请问怎么回事?

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧