C ++测验问题

时间:2013-08-04 19:31:28

标签: c++ inheritance abstract

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

问题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

3 个答案:

答案 0 :(得分:1)

  • Q1 OK

  • Q2取决于“o”的含义。实际上,“o”被破坏 - 它是堆栈上的指针,但是o指向的对象没有被破坏。

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

  • Q4确定

  • Q5因为缺少复制构造函数d)似乎最合适。但实际上,即使删除了此内存,它也可能会输出“世界”。

答案 1 :(得分:0)

让我们看看。

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

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

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

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

  5. 您可以自己测试,然后考虑它为什么会发生。例如,在我的编译器上,由于尝试删除内存两次,它会打印“world”并崩溃。

答案 2 :(得分:0)

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

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

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

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

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