首页 > 试题广场 >

下列代码编译时会产生错误的是()

[单选题]
下列代码编译时会产生错误的是()

#include <iostream>
using namespace std;
struct Foo {
    Foo() {}
    Foo(int) {}
    void fun() {}
};

int main(void) {
    Foo a(10);
    a.fun();
    Foo b();
    b.fun();
    return 0;
}

  • 语句1
  • 语句2
  • 语句3
  • 语句4
推荐
语句3应该为Foo b,但语句3没出错语句4出错了,出错提示request for member 'fun' in 'b', which is of non-class type 'Foo()'。感觉似乎语句3被解释成函数声明了,b成了函数指针,没有成员fun()。不知道这样理解对不对。。。 。。。
编辑于 2015-11-21 23:39:29 回复(11)
Foo b();定义一个对象是不正确的,可能把这句看成一个函数的声明;4句就出错了。
发表于 2015-04-26 20:23:30 回复(0)
Foo b(); 声明了返回类型为Foo,参数为空的函数。因此导致b.fun()编译错误。
发表于 2015-07-25 15:44:57 回复(0)
发表于 2015-07-14 16:38:24 回复(0)
无参数的构造函数应当如下声明对象:
Foo b;
或者采用如下显示调用方式:
Foo b=Foo();
题目中写***使得编译器认为在函数中声明了一个返回值类型是Foo的函数,该函数的名称是b,所以在编译的时候会发生错误,提示没有该成员



发表于 2016-09-01 00:14:47 回复(0)
zgz头像 zgz
在C++中,调用默认构造函数初始化,不应该加()。
发表于 2016-07-31 13:33:22 回复(0)
啊呀,其实语句3定义了一个函数而已,返回值类型为Foo,b为函数名。既然都没有b对象存在,通过b调用函数fun肯定是会报错的啦。
发表于 2015-08-20 14:02:22 回复(1)
语句3中Foo b( )是定义一个函数b,参数类型为空,返回值类型为Foo。
所以语句4中b.fun( )会出错,因为b本身不是一个对象,何来调用函数?
发表于 2017-06-06 21:54:22 回复(0)
语句3应该写成Foo b;或者Foo b = Foo();
发表于 2014-10-25 00:25:59 回复(2)
在栈上实例化对象的时候,无参构造不加括号。
发表于 2020-04-13 02:09:27 回复(0)
语句3声明了一个返回值类型为foo,参数为空的函数;使用不带参数的构造函数应该是foo b;
发表于 2018-04-12 11:47:45 回复(0)
这里应该是用类的思想,两个Foo是构造函数,程序中不应该出现无参构造函数的形式,所以语句3被认为是函数声明,语句4又把b当做对象出错
编辑于 2015-08-13 11:37:41 回复(0)

构造函数的调用分三种:
括号法:Foo a(10);
显示法:Foo a = new Foo(10);
隐式法:Foo a = 10;//会自己调用系统提供的默认拷贝构造函数
对于语句③ Foo b();会被编译器当做是函数声明,不会报错,当执行到语句④ b.fun()就会报错,因为一个函数声明怎么可以调用一个成员函数呢?

发表于 2023-09-01 10:51:06 回复(0)
第三句被称为“最头疼的语法解析”问题,即编译器把正常语句翻译为了声明语句。可以不加括号、或者使用{}来代替():Foo b{}
发表于 2023-07-21 14:16:00 回复(0)
调用无参构造函数不能加括号,如果加了编译器认为这是一个函数声明
发表于 2023-03-10 08:41:40 回复(0)
3,Foo b();会被解析成函数声明
发表于 2022-03-16 21:28:25 回复(0)
shit, 有人跟我一样,看一眼发现没有注释语句x的直接跳过的吗
发表于 2022-03-08 09:23:58 回复(0)
语句3,编译器视为函数声明,然后语句4就报错了~
发表于 2021-04-10 17:24:04 回复(0)
<p>foo不是一个类呀,结构体也能像语句三这样创建变量吗?</p><p><br></p>
发表于 2020-10-27 12:12:32 回复(0)
发表于 2020-09-22 22:02:15 回复(0)
这个题在牛客上看到过2次,选3答案是4,选4答案是3
发表于 2020-06-24 08:20:53 回复(0)