我对c ++中的以下代码有两个问题。
A obj()
中的main()
行是什么意思?它没有给出任何错误。
为什么下一行obj.fun();
会出现以下错误?
请求'obj'中的成员'fun',这是非类型'A()'
代码是:
#include<iostream>
using namespace std;
class A{
public:
A(){
cout<<"Constuctor called\n";
}
~A(){
cout<<"Destuctor called\n";
}
void fun(){
cout<<"YES";
}
};
int main(){
A obj();
obj.fun();
return 0;
}
答案 0 :(得分:8)
这是一个非常棘手的问题,但您实际上将obj
声明为函数,它不接受任何参数并返回A
的实例。
更改为
A obj;
如果您有一个支持C ++ 11的编译器(现在大多数情况下,除非您运行旧版本,但有些需要特殊标志才能启用它),那么您也可以这样做
A obj{};
答案 1 :(得分:1)
涉及表达式语句的语法含糊不清 和声明:具有函数样式的表达式语句 显式类型转换(5.2.3),因为它最左边的子表达式可以 与第一个声明者开始的声明无法区分 (a。在这些情况下,声明是声明。[注意:To 消除歧义,整个声明可能需要进行审查 确定它是表达式语句还是声明。这个 消除许多例子的歧义。 [例子:假设T是a simple-type-specifier(7.1.6),
T(a) - > m = 7; //表达式语句
T(一)++; //表达式语句
T(a,5)&lt;&lt; C; //表达式语句T(* d)(INT); //声明
T(E)[5]; //声明
T(f)= {1,2}; //声明
T(* G)(双(3)); //声明在最后一个例子中 在上面,g,它是指向T的指针,被初始化为double(3)。这个 由于语义原因,当然是不正确的,但这并不影响 句法分析。 - 例子]
基本上,在C ++(和C)中,如果一段代码可以解释为 声明,它将是。
答案 2 :(得分:0)
A obj();
说你正在声明一个返回A对象的函数,并且没有任何参数。
要创建class A
对象,只需编写
A obj;
给出here
的解释这是因为空的括号组将构成rectc a 函数声明而不是对象声明:它将是一个 不带参数的函数,返回一个type值 矩形。
答案 3 :(得分:0)
在此代码中,实际错误位于A obj()
,
相反它应该是A obj;
obj
是类的对象,所以它不应该跟随大括号。当程序从main()开始执行时,A obj
创建类A的对象。创建对象时,将调用该对象所属的类的构造函数,并打印“构造函数”。类似地,当控件移出main()
时,将调用析构函数并打印“析构函数”。
func()
是一个函数,因此它应该跟随大括号。