这个问题来源于一道 C++考试题,要求阅读代码写出输出,代码如下:
#include <iostream>
#include <iomanip>
using namespace std;
class sample {
private:
int x;
public:
sample(int val = 0)
{
x = val;
cout << "构造" << x << endl;
}
sample(const sample &obj)
{
x = obj.x;
cout << "拷贝构造" << x << endl;
}
~sample()
{
cout << "析构" << x << endl;
}
void operator++()
{
x++;
}
friend sample operator+(const sample &a, const sample &b)
{
sample tmp;
tmp.x = a.x + b.x;
return tmp;
}
};
void foo(sample i);
int main()
{
sample s1, s2(1);
foo(s1);
foo(2);
cin.get();
return 0;
}
void foo(sample i)
{
static sample s3 = i + 1;
++s3;
}
问题主要集中在foo
函数中
static sample s3 = i + 1;
这一行。当执行到foo(s1)
时,我认为函数中关于 s3 的这一句执行顺序是这样的:
我使用 Visual Studio 2017 编译,Debug x86 编译预设编译运行来检验我的设想,实际输出如下:
构造 1
构造 0
拷贝构造 1
析构 1
析构 1
实际输出和我的设想不同之处在于,输出中没有上述 3.的输出。但是问题在于,进行单步调试后,我观察到在这句代码执行完毕进入++s3
时,s3 对象确实已经被创建了,那么 s3 对象是用什么样的方式创建的呢?因为无论如何要创建一个新对象一定要调用某个构造函数,但是我没有能得到任何 s3 构造时产生的输出。
请问 s3 对象是以怎样的方式被构造的呢?感激不尽!
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.