如何在C++中使用构造函数?为什么它似乎允许使用它作为参数?

Ely*_*Ely -1 c++ constructor return

我偶然发现了这个问题(这是一个不同的例子).大多数人说构造函数不会返回任何内容.但是,为什么我的例子有效呢?

sequence(1, 2)是一个构造函数,显然可以在我的机器上使用.我使用g++和尝试没有选项和C++ 11选项.两者都适用于我的情况.

这个例子来自一门课​​程.我按原样复制,无论是否public有意义,或其他.

例:

#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;

void printer(int i) {
    cout << i << ", ";
}

struct sequence {
    int val, inc;
public:

    sequence(int s, int i) : val(s), inc(i) {
        cout << "Sequence(" << val << ", " << inc << ")" << endl;
    }

    operator int() const {//LINE I
        int r = val;
        cout << r << endl;
        return r;
    }
};

int main() {
    vector<int> v1(7);
    fill(v1.begin(), v1.end(), sequence(1, 2)); //LINE II
    for_each(v1.begin(), v1.end(), printer);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果:

Sequence(1, 2)
1
1
1
1
1
1
1
1, 1, 1, 1, 1, 1, 1, 
Run Code Online (Sandbox Code Playgroud)

更新

谢谢大家的答案.但我仍然很困惑,无法把它放到我的脑海中,我想可能缺少适当的术语.

到目前为止,我想我明白了:

  • sequence是一个struct对象
  • sequence(int, int) 是构造函数定义,不返回任何内容
  • ()operator on sequence只返回val值.

那为什么它有效:

  • 调用sequence(1,2)创建一个可以访问和读取的临时对象
  • ()用于填充相应的元件.基本上fill使用sequence()去填补值.
  • 之后,fill完成了临时对象被销毁.它的范围是函数的范围fill

到目前为止听起来不错吗?

dre*_*zor 6

因为你有operator int()将你的sequence类对象转换为1.您可以在打印时轻松观察它,1并为每次转换创建换行符.