首先,想开始提及我的英语不好对不起。

在C++中,当我们要创建某种类型的类的实例时,通常使用“ClassType ObjectName;”。

例如,

class Foo {};
Foo instance1;

但是,我遇到了一些代码,使我有些尴尬。接下来。
class A {/*....bla bla*/};
class B {
    public:
        B(char*) {}
};

void main() {
    A aaa;
    B(aaa); // this makes a error.
}

通过反复试验,我可以知道“B(aaa);”与“B aaa;”完全相同。
但为什么?这是标准文件中描述的那种吗?如果是这样,请告诉我在哪里可以看到。

提前致谢。

更新:
感谢您的所有答复。
但是我认为我已经省略了一些代码。抱歉。
#include <iostream>
using namespace std;

class A
{

};
class B
{
public:
    B() { cout << "null\n";  }
    B(char* str) {}
    void print() {
        cout << "print!\n";
    }
};

void main()
{
    A aaa;
    //B(aaa); this line makes a error that says 'redefinition; different basic types'. VS2008
    B(aa1);
    aa1.print();
}

输出:
null
print!

如您所见,“B(aa1)”语句意味着不将aa1作为参数传递给构造函数,而是创建一个实例aa1。

到目前为止,我知道“B(argument)”是“传递参数以 push 一个超载的构造函数,并创建一个无名的临时实例”。
但是值“aa1”看起来既不是定义值也不是临时实例。

最佳答案

有时需要用括号括起来,以便用消除声明的歧义。

例如:

int *f();     // a function returning a pointer to int
int (*f)();   // a pointer to a function returning an int

该标准并没有列出需要在何时何地使用括号以及可能在何处被禁止使用(因为它是无用的)的确切标准,而是说允许使用。

因此,您最终会感到有些困惑:
int   a;     // an int variable
int   (b);   // another int variable

10-08 11:40