目录
错题1
若有以下说明,则在类外使用对象objX成员的正确语句是()。
class X
{
int a;
void fun1();
public:
void fun2();
};
X objX;
A. objX.a=0; |
---|
B.objX.fun1(); |
C.objX.fun2(); |
D.X::fun1(); |
答案 C
解析:C++中class默认成员为private,struct默认为public。
错题2
以下程序段执行后结果是()
#include<stdio.h>
int` `main(){
``short` `*p,*q;
``short` `arr[15] = {0};
``p = q = arr;
``p++;
``printf``(``"%d,"``, p - q);
``printf``(``"%d,"``, (``char``*)p - (``char``*)q);
``printf``(``"%d"``, ``sizeof``(arr) / ``sizeof``(*arr));
}
答案 1,2,15
错题3
有如下语句序列:
char str[10];
cin>>str;
当从键盘输入 “I love this game” 时,str 中的字符串是()
答案 I
解析:cin输入时遇到空格自动结束输入。
错题4
下列运算符,在C++语言中不能重载的是()
解析:并不是所有的操作符都能被重载。除了 . , .* , :: , ? : , sizeof , typeid 这几个运算符不能被重载,其他运算符都能被重载。
.表示成员选择
.*表示指向成员操作的指针
?=表示条件操作 expr?expr:expr
2022.11.28
错题5
对于如下C++程序,请问输出结果是()
int main() {
int a = 1, b = 3, c = 2;
while (a < b < c)
{
++a;
--b;
--c;
}
cout << a << " " << b << " " << c << "\n";
return 0;
}
答案 3 1 0
解析:a<b<c运算可以看为(a<b)<c的运算,而a<b结果为bool值,只有0,1两种选项。
错题6
一 重载(overload)
基本条件:
- 函数名必须相同;
- 函数参数必须不相同,可以是参数类型或者参数个数不同;
- 函数返回值可以相同,也可以不相同;
二 重写(override)
基本条件:
-
重写的函数和被重写的函数必须为virtual函数,分别位于基类和派生类中;
-
重写的函数和被重写的函数函数名和函数参数必须一致;
-
重写的函数和被重写的函数返回值相同,或者都返回指针或引用,并且派生类虚函数所返回的指针或引用的类型是基类中被替换
的虚函数所返回的
-
指针或引用的类型的子类型。
三 隐藏
基本条件:
- 子类和父类的函数名称相同,但参数不同,此时不管父类函数是不是virtual函数,都将被隐藏。
- 子类和父类的函数名称相同,参数也相同,但是父类函数不是virtual函数,父类的函数将被隐藏。
2022.11.29
错题7
int a=5,则 ++(a++)的值是?
答案 编译出错
解析:++运算只能针对变量运算,括号内a++返回的是一个具体值,具体值进行左加加运算编译失败。如++5编译器会报错。
错题8
new和malloc的区别
1.new从自由存储区上分配内存,malloc从堆上分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配。那么自由存储区是否能够是堆(问题等价于new是否能在堆上动态分配内存),这取决于operator new 的实现细节。自由存储区不仅可以是堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存。
2.new、delete 返回的是某种数据类型指针;malloc、free 返回的是 void 指针。
3.使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算;使用malloc则需要显式地指出所需内存的尺寸。
4.new 可以调用对象的构造函数,对应的 delete 调用相应的析构函数;malloc 仅仅分配内存,free 仅仅回收内存,并不执行构造和析构函数。在new一个对象的时候,首先会调用malloc为对象分配内存空间,然后调用对象的构造函数。delete会调用对象的析构函数,然后调用free回收内存。
5.new、delete 是操作符,可以重载;malloc、free 是函数,可以重写(覆盖)。
错题9
阅读如下程序,该程序的执行结果为?
#include "stdio.h"
class A
{
public:
virtual void Test()
{
printf("A test\n");
}
};
class B: public A
{
public:
void func()
{
Test();
}
virtual void Test()
{
printf("B test\n");
}
};
class C: public B
{
public:
virtual void Test()
{
printf("C test\n");
}
};
int main()
{
C c;
((B *)(&c))->func();
((B)c).func();
}
答案
C test
B test
解析: (B *)(&c)是将对象c的地址转为B类型的指针,但是其仍然指向c的首地址,此时调用func()函数,因为在类B的func()中调用Test()函数没有this指针,所以此时调用的为c中的func()函数,输出C test,下面为类B创建对象名为c,调用B中的Test()。
错题10
深拷贝和浅拷贝的区别:浅拷贝主要是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝需要不但对指针进行拷贝,并对指针指向的内容进行拷贝,经过深拷贝后的指针是指向两个不同地址的指针。
2022.11.30
错题11
1.重载是用来描述同名函数具有相同或者相似功能,但是参数个数或者类型顺序不一样的函数管理操作
返回值不能作为重载的条件
2.重写是子类对父类同名函数的重新定义
二者区别:
1.作用域不同:重载是在同一区域,子类无法重载父类,父类同名函数的将被覆盖,重写是在父类与子类之间
2.重载是在编译期间根据参数列表决定,重写是在运行期间根据具体对象类型决定调用函数
多态条件:
1.要有继承
2.要有virtual虚函数重写
3.要用父类指针指向子类指针
错题12
以下关于STL各种容器和算法的sort和find函数对重载运算符的描述正确的是()
A.二叉树类型的容器的sort和find都会调用operator < |
---|
B.线性类型容器sort会调用operator < |
C.二叉树类型的容器的find会调用operator == |
D.线性类型容器使用std::find会调用operator == |
答案 C
解析:二叉树中没有相等的值。