我正在练习一个重要的测验,我发现有关c ++的20个问题我不太确定。他们没有回答,我想知道你是否可以帮助我回答他们,因为我还是一个正在学习的新手。我用箭头标出了一个答案,我认为这个答案对于每一个问题都是正确的。
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;
执行下面的函数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
在头文件中考虑以下函数声明:
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);
抽象类中有什么使它抽象化?
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
下面执行代码片段的结果是什么?
//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
答案 0 :(得分:1)
Q1 OK
Q2取决于“o”的含义。实际上,“o”被破坏 - 它是堆栈上的指针,但是o指向的对象没有被破坏。
Q3 b)您不能在返回类型上重载
Q4确定
Q5因为缺少复制构造函数d)似乎最合适。但实际上,即使删除了此内存,它也可能会输出“世界”。
答案 1 :(得分:0)
让我们看看。
选项b确实是正确的,但不是你的解释。它受到保护,因为SecondClass
使用公共继承继承自Base
。如果它是私人继承,那就不会这样了。
最有可能是正确的。 o
是指向使用new
创建的对象的指针,因此该对象将持续存在,直到delete
被调用为止。问题可能是指对象,但如果它们是指实际的指针o
,它会在范围的末尾被销毁。
重载的函数必须具有不同的签名。签名由函数的名称,参数的计数,类型和顺序组成。返回类型是不是签名的一部分。你应该可以从这里弄明白。
抽象类是一个至少有一个纯虚函数的类,所以你是对的。
您可以自己测试,然后考虑它为什么会发生。例如,在我的编译器上,由于尝试删除内存两次,它会打印“world”并崩溃。
答案 2 :(得分:0)
除了发布的其他答案,问题5还有未定义的行为。
{语言律师,请确认此问题}
在构造函数中,字符从字符串中逐个复制到字符数组中; 没有终止空字符。 print
方法将字符数组视为C样式字符串,cout
操作将打印data
(及更高版本)中的所有字符,直到找到终止空字符。 std::basic_string
数据结构可能不会将终止空字符存储为字符串的一部分。
该类没有复制构造函数,因此编译器会创建一个复制指针的复制构造函数。因此,将有两个实例指向相同的数据。
在内部块中,外部实例被分配给在内部块中创建的实例。内部实例是临时的,外部变量中的指针指向临时对象的数据。
语句块消失后,外部变量中的指针现在指向一个未使用的位置,并且预期的数据不再存在(当执行离开内部的范围时,预期的数据被删除声明块)。因此data
变量的outer
指针指向未知数据或未知位置(操作系统可能已将页面分页)。这是未定义的行为。