C ++中

时间:2017-04-25 03:20:24

标签: c++ constructor

#include <iostream>
using namespace std;

struct A {
    A(int i) {
        cout << "1 args" << endl;
    }
    A(int i, int j) {
        cout << "2 args" << endl;
    }
};

void foo(int i) {
    cout << "1 args" << endl;
}
void foo(int i, int j) {
    cout << "2 args" << endl;
}

int main() {
    int i, j;
    A(i, j);
    (A)(i, j);
    foo(i, j);
    (foo)(i, j);
}

输出:

2 args
1 args
2 args
2 args

我知道结果&#34; 1 args&#34;是因为&#34;(i,j)&#34;被评估为&#34; j&#34;。

但考虑到构造函数的不同之处还有什么功能呢?

2 个答案:

答案 0 :(得分:5)

构造函数是成员函数;如果您想尝试像任何其他函数一样“调用构造函数”,则代码可能是a.A(i,j);使用您已创建的某个对象a上的成员访问运算符。但这是不允许的,因为构造函数只被称为对象创建的一部分。

  1. A(i, j);符合语法 postfix-expression: simple-type-specifier ( expression-list {{ 1}}。该语法的含义是创建该类型的prvalue表达式,其中expression-list是构造函数参数。

  2. )与该语法不匹配,因为 (A)(i, j); 无法括号。但它确实与 simple-type-specifier 匹配,因此表达式cast-expression(这是一个逗号运算符表达式)强制转换为(i, j)。在这种情况下,转换为类类型的结果涉及构造该类类型的临时类型。

  3. A匹配 foo(i, j); postfix-expression: postfix-expression ( {{1} },这是一个带有该参数列表的函数expression-list的调用

  4. )也匹配相同的规则,因为foo (foo)(i, j); (仍然是 postfix-expression }

答案 1 :(得分:0)

对于那些寻找技术性答案的人,我会阅读M.M answer之类的内容:

A 类型 foo不是,所以:

(A)(i, j);    // cast to A the result of (i, j) ==> calls A(j) in conversion
(foo)(i, j)   // still the same as foo(i, j)