首页 > 试题广场 >

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

[单选题]
下列代码编译时会产生错误的是()
#include <iostream>
using namespace std;
struct Foo {
    Foo() {}
    Foo(int) {}
    void fun() {}
};
int main(void) {
    Foo a(10); //语句1  
    a.fun(); //语句2  
    Foo b(); //语句3  
    b.fun(); //语句4  
    return 0;
    16.
}

  • 语句1
  • 语句2
  • 语句3
  • 语句4
推荐
Foo b(); //语句3    这是是函数定义语句。 所以语句4会报错。

Foo b;  这才是调用构造函数。

编辑于 2015-01-26 21:08:58 回复(6)
Foo类定义了两个构造函数:Foo() {}和Foo(int) {}
这两个构造函数的形参表是不同的,称为构造函数重载。第一个是默认构造函数,第二个是形参为int的构造函数,而用于初始化一个对象的实参类型决定了使用哪个构造函数。
Foo b;//没有初始化式,所以运行默认构造函数;
Foo a(10);//接受一个int实参的构造函数用于初始化a;
而第三句Foo b();是一个函数声明语句,类似于:int add();不能去调用成员函数。
题目的本意是,实例化一个类的对象,然后用这个对象去调用成员函数fun().
所以第四句不对,是因为第三句定义了一个函数。应该将第三句改成:Foo b;


发表于 2017-09-06 15:30:01 回复(1)
语句四出错来源于语句三。编译器认为语句三声明了一个返回Foo无参数的函数b,然后编译语句四时发现语法错误。
发表于 2015-08-14 15:14:10 回复(0)
调用无参构造函数即编译器默认生成的构造函数时,直接定义一个对象,不能在后面加一个括号,否则就为函数的定义,会产生错误。
发表于 2015-09-12 11:24:52 回复(0)
//如果写成Foo b(); 编译器会认为这是一个返回值类型为Foo的函数声明的,而并不是
//构造对像b了
发表于 2015-09-15 17:05:48 回复(0)
答案:D
语句3的Foo b()相当于声明一个返回值类型是Foo结构体的函数b,这将会导致语句4编译出错。
发表于 2015-01-26 15:47:59 回复(0)
语句3声明了一个返回类型Foo的函数,不是类对象的声明
故语句四会报错,提示对象not declared
发表于 2018-04-10 08:45:03 回复(0)

答案: D

  • 语句 1 实例化 F oo 类型的对象 a
  • 语句 2 调用 a 的函数。
  • 语句 3 为声明一个返回 Foo 结构体类型的函数 b
  • 语句 4 为错误语句。

发表于 2015-03-31 23:15:51 回复(0)
调用结构体中的构造函数不代表构建了结构体对象。如果改成Foo b就会构建了对象就能调用函数
发表于 2019-08-24 20:58:37 回复(0)
题目有歧义,定义类函数时,必须指定参数名,否则foo结构的编译就出错了
发表于 2019-05-24 10:21:42 回复(0)

Foo b()声明一个返回值类型为Foo的函数b()


发表于 2019-04-13 17:28:20 回复(0)
语句4的错误来源于语句3,因为编译器将语句3解析成一个函数声明,故选D。
发表于 2018-11-18 18:15:45 回复(0)
那为什么不是c错。。。我擦,这题有点子小坑啊
发表于 2018-11-09 12:24:06 回复(0)
为什么我经常手贱,点的c,看答案时变成了d。。。。记住啊,默认构造函数不要加括号
发表于 2018-05-08 22:51:23 回复(0)
这居然是一个类,唉,好心累
发表于 2018-04-21 09:11:31 回复(0)
将
Foo b(); //语句3
改为
Foo b;//语句3
就ok了

发表于 2018-03-18 19:58:08 回复(0)
语句四出错来源于语句三。编译器认为语句三声明了一个返回Foo无参数的函数b,然后编译语句四时发现语法错误。
发表于 2017-12-06 09:23:32 回复(0)
编译器会认为b是一个函数。。。
发表于 2017-09-03 17:00:45 回复(0)
如果希望调用类的默认构造函数来生成类对象,不能写左右括号,写左右括号的话可能与函数声明产生二义性。
人家说这是程序语法,没有为什么。你知道我很想掀桌子的,那么多符号,就只能这么妥协来规定语法。烦C++,据说java可以这么写。
class Foo {
    public:
         Foo() {}
        Foo(int) {}
        void fun() {}
}

void main(void) {
    Foo a(10);    // 调用自定义构造函数生成对象
    a.fun();    // 调用类的成员函数
    Foo b;    // 调用默认构造函数生成对象
    b.fun();    // 调用类的成员函数
    Foo c();    // 声明了一个返回值类型为Foo的无参函数b
    c.fun();    // 出错
}

发表于 2017-08-06 20:47:21 回复(0)
哎,又掉到坑里了
发表于 2017-04-03 17:53:16 回复(0)
程序员面试宝典的一道题
发表于 2017-02-26 17:50:12 回复(0)