为什么“ClassType Object;”等于“ClassType(Object);”在C ++中?

时间:2015-07-07 07:52:11

标签: c++

首先,我想开始提到我的英语不好可能会后悔。

在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(论证)”为“通过论证推动一个超负荷的建设者之一,并创建一个无名的临时实例”。 但是值“aa1”看起来既不是既定值也不是临时实例。

1 个答案:

答案 0 :(得分:3)

有时,一组括号需要来消除声明的歧义。

例如:

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