C++复制构造函数和构造函数调用小困惑

el/2024/5/21 20:37:27

最近看清华大学郑莉老师的C++课程,过C++的基础知识。遇到了一点小问题。
B站清华大学C++课程
在进行类组合例子的调试中,有些不解的地方。先上代码。

#include "pch.h"
#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;
};//成员函数的实现
Point::Point(Point &p) {x = p.x;y = p.y;cout << "Calling the copy constructor" << endl;
}class Line{
public:Line(Point xp1, Point xp2);Line(Line &l);double getLen() { return len; }
private:Point p1, p2;double len;
};
Line::Line(Point xp1, Point xp2):p1(xp1),p2(xp2)
{//p1 = xp1;//p2 = xp2;cout << "Calling constructor of Line" << endl;double x = static_cast<double>(p1.getX() - p2.getX());double y = static_cast<double>(p1.getY() - p2.getY());len = sqrt(x*x + y * y);
}Line::Line(Line &l):p1(l.p1), p2(l.p2) 
{//p1 = l.p1;//p2 = l.p2;cout << "Calling the copy constructor of Line" << endl;len = l.len;
}int main()
{Point myp1(1, 1), myp2(4, 5);Line line(myp1, myp2);Line line2(line);cout << "The lenth of the line is: " << line.getLen() << endl;cout << "The lenth of the line2 is: " << line2.getLen() << endl;return 0;
}

在这里插入图片描述
Point的复制构造函数共调用了6次。
而简单替换两个函数:

Line::Line(Point xp1, Point xp2)//:p1(xp1),p2(xp2)
{p1 = xp1;p2 = xp2;cout << "Calling constructor of Line" << endl;double x = static_cast<double>(p1.getX() - p2.getX());double y = static_cast<double>(p1.getY() - p2.getY());len = sqrt(x*x + y * y);
}Line::Line(Line &l)//:p1(l.p1), p2(l.p2) 
{p1 = l.p1;p2 = l.p2;cout << "Calling the copy constructor of Line" << endl;len = l.len;
}

结果如下:
在这里插入图片描述
Point的复制构造函数共调用了2次。
非常不解。
p1 = xp1;与p1(xp1)不是一样的嘛?
先记录下来。


问题初步解决:

Line::Line(Point xp1, Point xp2)//:p1(xp1),p2(xp2)
{Point p1 = xp1;Point p2 = xp2;cout << "Calling constructor of Line" << endl;double x = static_cast<double>(p1.getX() - p2.getX());double y = static_cast<double>(p1.getY() - p2.getY());len = sqrt(x*x + y * y);
}Line::Line(Line &l)//:p1(l.p1), p2(l.p2) 
{Point p1 = l.p1;Point p2 = l.p2;cout << "Calling the copy constructor of Line" << endl;len = l.len;
}

可实现六次调用复制构造函数
但,新问题出现:调试的时候发现Line::Line(Point xp1, Point xp2)首先调用了Point的构造函数,并初始了p1,p2为(0,0),这又是为什么呀?


http://www.ngui.cc/el/4994714.html

相关文章

前置++与后置++区别

对于前置与后置以前只知道它们的两点区别&#xff1a; 1. 前置&#xff1a;先加再用&#xff1b;后置&#xff1a;先用后加。 2. i效率比i效率高&#xff1b; 今日又添加一项&#xff1a; 3. 前置可操作&#xff0c;后置不可操作 只知其果&#xff0c;不明其因非学者姿态。 下…

C++基础(code)

C基础学习&#xff08;code&#xff09; 算是突袭学习吧&#xff0c;可能不是很细。 英语渣&#xff0c;但还是可能会写一些英文注释&#xff0c;提高提高~~ #include <iostream> using namespace std;//函数声明&#xff0c;要么定义在main前,要么在main前面自己添加定…

NEO4J 安裝

NEO4J 安裝 安裝教程&#xff1a; https://blog.csdn.net/sinat_36226553/article/details/108541370 注意事項 不能安裝在 D:\Program Files下&#xff0c;會有不能識別’.ps1’ 拓展名&#xff0c;猜測是不能識別目錄中的空格導致。

Elasticsearch 进阶学习

先上两个学习链接&#xff1a; Elasticsearch学习笔记_KISS-CSDN博客 Elasticsearch API查询_森四杨的博客-CSDN博客 1. es分布式集群 1. 搭建过程 2. 概念 节点、分片&#xff08;Shards&#xff09;、副本(Replicas)、索引、文档、字段、映射对索引中的文档可以进行索引…

python 正则表达式转义上的 r 与反斜杠

先阅读 https://blog.csdn.net/jinixin/article/details/56705284 后举例 转义有两种&#xff1a; 首先是正常的字符串转义&#xff0c;对于特殊的字符进行转义。然后&#xff0c;对于正则表达式还要进行一次转义。 使用原生字符r 可以跳过一次转义。所以在正则表达式前可以…

Python 转义字符和正则表达式的元字符

python转义字符 图片来自 Python 转义字符 \x 正则表达式元字符 正则表达式其他字符

neo4j 关于日期和时间的操作

最近使用neo4j存储数据&#xff0c;其中包含了大量的时间数据&#xff0c;存储的时候都是以字符串的形式存储&#xff0c;如 ‘11:07’&#xff0c;导致后期查询后的数值计算比较困难。中文的这方面笔记似乎比较少&#xff0c;于是记录一下。日期和具体的时间操作类似&#xff…

Lua语言在移动iSO平台上成为新宠

http://www.cwowaddon.com/article-39-1.html Lua最流行的应用场景是在游戏中作为处理逻辑的脚本&#xff0c;即用来编写游戏的任务脚本&#xff0c;以实现游戏的可配置性和可扩展性。在游戏中Lua脚本的加载不需重启服务器&#xff0c;尽管脚本的运行效率低于编译好的二进制代…

Leaves -- iOS上一种图书翻页效果的实现

http://www.cnblogs.com/zhw511006/archive/2011/10/14/2212187.html 参考资料&#xff1a;App Store-safe Page Curl animations 源码下载地址&#xff1a;https://github.com/brow/leaves

ios xml解析比较 XMLPerformance

http://developer.apple.com/library/ios/#samplecode/XMLPerformance/Introduction/Intro.html
最新文章