这是变量声明吗?不是的,用默认构造函数声明一个变量应该写作:a a;;它应该是函数声明:该函数名称为a,没有参数,返回值为a类型.
单独使用: a(); 表示:struct a __cdecl(void),这是一个匿名的函数声明. 函数声明中:void func(a()); 表示:void __cdecl func(struct a (__cdecl*)(void)) ,很显然,这里a()就变成了一个函数指针声明:struct a (__cdecl*)(void). 在表达式中:?for_each(arr, arr+3, a()); 在这里,a() 才能当作一个表达式,很显然,唯有“默认构造函数”才能符合该用途.现在再来解决 a a( a()) 是什么东西?在这里,当同时可以解释成函数声明与变量声明的场合,函数声明优先. 【程序编程相关:软件开发公司管理手册】
我们再看看 a() 是什么?实际上,在不同场合,a() 有不同的意义: 【推荐阅读:Installing Oracle 10】
a a = a(),也只能解释成变量声明(调用拷贝构造函数). 【扩展信息:SCJP考试认证复习笔记系列之三】
a a (a(), 3) ,就只能解释成变量声明(调用一般构造函数).
这篇文章的意义在哪里? 有一部份人认为这篇文章没有意义,甚至无聊,更甚者认为是在混淆视听.理由是,写程序者要有好的编码风格,比如: a a (a()) 如果是变量声明,就应该写成: a a = a(). a a (a()) 如果是函数声明,就应该写成: a a(a (*) ()). 这说法没错,而且好的风格极其重要. 但是,许多人却常常犯下类似的错误,并不是因为编码风格不好,而恰恰是对该文章要表达的内容不了解造成的.一个最常见的错误如下: a a() 本意可能是想声明一个变量,结果却变成函数声明.就是因为习惯性的加上了括号造成的.而如果没有意识到这是一个函数声明的话,可能就不太清楚到底错在哪里.