计算机科学:编译时错误

学习计算机科学的概念,示例问题和解释

大学导师应用商店 大学导师安卓商店

例子问题

例子问题1:调试

阶级基础{};

派生类:公共基{

公众:

无效方法(){cout<< "method1\n";}

};

class Derived2: public Base{

公众:

无效方法(){cout<< "method2\n";}

};

int main () {

Base* bp = new Derived();

导数为d2* d2p = bp;

D2p ->方法();

}

用c++编译和运行程序的结果是什么?

可能的答案:

程序编译并运行,打印“method2”

程序编译并运行到不打印任何东西

程序编译并在运行时崩溃。

程序不能编译。

程序编译并运行,打印“method1”

正确答案:

程序不能编译。

解释

在这个问题中,Derived1和Derived2是基类的子类。如果我们看一下这一行:

Base* bp = new Derived();

我们将一个新的派生类赋值给基指针。这将被编译。将Base看作一个较大的对象,因为它是父对象,因此将较小的对象复制到较大的对象中是可以接受的。

现在让我们来看看这个:

导数为d2* d2p = bp;

这一行将导致程序无法编译。由于基类被认为是“更大”的对象,将一个更大的对象复制到一个“更小”的对象将导致无法复制所有内容,这被称为切片的问题

我们甚至不需要看下一行,因为我们知道程序将崩溃。

例子问题1:调试

考虑到:

Const int = 10;

下列哪个将被编译?

可能的答案:

Int * p = &x

常量int * r = &x

Int * const q = &x

以上所有

以上都不是

正确答案:

常量int * r = &x

解释

首先我们看一下给定的语句:

Const int = 10;

“int”前面的const意味着x将始终保持10的值,并且它不会改变。

让我们观察所有的选项。

Int *p =&x

这一行表示将x的地址(在内存中)分配给指针p。然而,这将无法编译,因为int * p没有被标记为const。X被标记为const,所以这迫使int * p也是一个const。

Int * const q = &x

本例中有一个const,但它在错误的位置

常量int * r = &x

const在正确的位置,这是正确的答案

例子问题2:调试

阶级基础{

保护:

无效的方法();

};

派生类:公共基{


};

int main () {

基地b;

b.method ();/ /行

派生d;

d.method ();/ /直线B

}

下面哪个选项是正确的?

可能的答案:

这些都不是

行A将编译

行B将不会编译

行A不会编译

行B将编译

行A不会编译

行B将不会编译

行A将编译

行B将编译

正确答案:

行A不会编译

行B将不会编译

解释

要理解这个问题,我们必须理解受保护方法的含义。受保护的方法是一种方法,它可以被自己类中的方法以及它的子类所访问。方法中调用受保护的方法子类

我们可以看到,method()在main内部被调用。这应该已经引起了警惕。受保护类在子类外部被调用,因此它不会被编译。即使它被称为在Base和Derived对象中,调用不在Base和Derived类中进行,因此这两行都不会编译。

大学导师的学习工具