首先,我想开始提到我的英语不好可能会后悔。
在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”看起来既不是既定值也不是临时实例。
答案 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