-4

我正在练习一个重要的测验,我发现了 20 个关于 c++ 的问题,我不太确定。他们没有答案,我想知道你是否可以帮我回答他们,因为我还是一个正在学习的菜鸟。我用箭头标记了我认为对于每个问题都是正确的答案,并给出了简短的理由。

问题 1

class Base{
    protected:
        int a;
    public:
        void seta(int x){a = x;};
        void printa(void){cout << a;};
};

class SecondClass : public Base
{
    public;
        int b;
};

void main (void)
{
    Secondclass tmp;
    tmp.seta(12);
    tmp.printa();
}

a)SecondClass.a is public;
b)SecondClass.a is protected; <-- (Since SecondClass inherits from Base)
c)SecondClass.a is private;
d)SecondClass.a is not accessible;

问题2

执行下面的函数 foo() 会发生什么?假设 bar() 是一个现有函数。

void foo()
{
    Object *o = new Object;
    bar(o);
}

a) o is destroyed at the end of the scope of foo
b) o is not destroyed <-- (since there is no delete and o is a pointer)
c) o is destroyed if there is no exception in bar()
d) None of the above

问题 3

考虑头文件中的以下函数声明:

void doit(char *, int);
int doit(char *);
float doit(float, float);

Which of the following declarations cannot follow in the same header (no idea):
a) void doit(int, char*);
b) float doit(char *);
c) int doit(int, int);
d) int doit(int);

问题 4

抽象类中存在什么使其抽象?

a) virtual keyword prefix o member function
b) virtual keyword prefixed to member function and sufixed with =0 <--(since without    the =0 it wouldnt be a pure virtual method which must be overriden)
c) member function in protected mode
d) any of the above

问题 5

下面执行代码片段的结果是什么?

//suitable #includes
class Text
{
public:
    Text(const std::string &text):data(new char[text.size()+1000]){
        std::copy(text.begin(),text.end(),data);
        }
    ~Text(){
        delete [] data;
        }
    void print() const{
        std::cout << data << std::endl;
        }
private:
    char *data;
};

int main(int, char *[])
{
    Text outer("hello");
    {
        const Text inner("world");
        outer = inner;
    }
    outer.print();
    return 0;
}

(No idea abou the answer)
a) prints "world", but there is a buffer overflow in the constructor
b) prints "world", no problems anywhere
c) prints "hello"
d) none of the above
4

3 回答 3

1
  • Q1 好的

  • Q2 取决于他们所说的“o”是什么意思。事实上,“o”被销毁了——它是堆栈上的一个指针,但是 o 指向的对象并没有被销毁。

  • Q3 b)您不能重载返回类型

  • Q4 好的

  • Q5 因为缺少复制构造函数 d) 似乎是最合适的。然而在实践中,它可能会输出“world”,即使这个内存被删除了。

于 2013-08-04T19:40:54.587 回答
0

让我们来看看。

  1. 选项 b 确实是正确的,但不是你的解释。它受到保护,因为SecondClass继承自Base使用公共继承。如果是私有继承,就不会这样了。

  2. 很可能是正确的。o是一个指向使用 创建的对象的指针new,因此该对象将持续存在直到delete被调用。问题可能是指对象,但如果它们指的是实际的指针o,它会在作用域的末尾被销毁。

  3. 重载的函数必须有不同的签名。签名由函数的名称以及参数的数量、类型和顺序组成。返回类型不是签名的一部分。你应该可以从这里弄清楚。

  4. 抽象类是至少有一个纯虚函数的类,所以你是对的。

  5. 你可以自己测试一下,然后想想为什么会这样。例如,在我的编译器上,它打印“世界”并由于尝试两次删除内存而崩溃。

于 2013-08-04T19:44:20.687 回答
0

除了发布的其他答案外,在问题 5 中,您还有未定义的行为

{语言律师,请确认此问题}
在构造函数中,将字符串中的字符一一复制到字符数组中;没有终止 nul 字符。该print方法将字符数组视为 C 样式的字符串,并且该cout操作将打印其中data(及之后)的所有字符,直到找到终止的 nul 字符。数据结构可能不会将std::basic_string终止 nul 字符存储为字符串的一部分。

该类没有复制构造函数,因此编译器创建了一个复制指针的复制构造函数。因此将有两个实例指向相同的数据。

在内部块中,外部实例被分配给在内部块中创建的实例。内部实例是临时的,外部变量中的指针指向临时对象的数据。

语句块消失后,外部变量中的指针现在指向一个未使用的位置,并且预期的数据不再存在(当执行离开内部语句块的范围时,预期的数据被删除) . 因此,变量的data指针outer指向未知数据或未知位置(操作系统可能已调出数据)。这是未定义的行为。

于 2013-08-04T19:57:42.787 回答