前言
之前在回顾c++时,了解到拷贝构造函数的调用时有三种情况
-
用类的一个对象去初始化另一个对象时
-
当函数的形参是类的对象时(也就是值传递时),如果是引用传递则不会调用
-
当函数的返回值是类的对象或引用时
我有疑问的是第三种,我在好几种编译器上面试了,函数返回时并没有调用拷贝构造函数。
代码如下
#include "iostream"
using namespace std;
class Point{
public:
~Point(){
cout<<"对象地址为"<<this<<"析构函数调用完毕"<<endl;
}
Point(){cout<<"对象地址为"<<this<<"缺省构造函数调用完毕"<<endl; }
Point(const Point& P)
{
x=P.x;
y=P.y;
cout<<"对象地址为"<<this<<"拷贝构造函数调用完毕"<<endl;
}
Point(int X,int Y)
{
x=X;y=Y;
cout<<"对象地址为"<<this<<"带参构造函数调用成功"<<endl;
}
private:
int x,y;
};
Point g(void)
{
Point a(3,7);
cout<<"函数里面Point的地址是"<<&a<<endl;
return (a);
}
main(void)
{
Point p=g();
cout<<"主函数里面p的地址为"<<&p<<endl;
}
我用C-free和vc,dev_c执行结果如下,用vscode执行时倒是调用了依次拷贝构造函数,是函数g返回的临时对象初始化main函数里面的p时。但是g函数里面临时对象的拷贝构造函数没有调用。
之后利用g++ -fno-elide-constructors demo1.cpp编译后结果如下
后话
我当时在vscode里面四处配置 -fno-elide-constructors ,不知道这个东西怎么用,因为编译时如果加上这个会关掉rvo优化。这样就可以看到更底层的调用了,vscode我是真不知道怎么运行这个c++,因为vscode要运行c++的话需要配置环境,就是要装一个MinGW64,之后配置环境变量。这个地方我不赘述了csdn搜一搜很多。
后来朋友指点了一下,发现cmd直接就可以运行。
-
很简单你需要先配好g++环境变量,我的如下我放在d盘了,把bin目录放进去即可。
-
然后输入 g++ -v查看版本,目的是确认你的环境变量有没有配置好。
-
然后就是 g++ -fno-elide-constructors demo1.cpp -o demo1.exe这句话就是关掉rvo优化编译demo1.cpp,然后生成demo1.exe。-o demo1.exe不加也会自动生成一个exe,-o只是命名一下而已。
- 然后-gdb demo1.exe 然后run(运行)
- quit可以推出gdb
感想
其实这才是我想说的就是g++运行,加上一些参数 可以运行的更加底层。想来想去还是linux系统好,过段时间准备用Linux,可是很多东西软件舍不得啊!