单选题
1.若用数组名作为函数调用时的实参,则实际上传递给形参的是(D)
A 数组元素的个数
B 数组的第一个元素值
C 数组中全部的元素值
D 数组的首地址
2.在 int a=3,int *p=&a; 中,*p 的值是 (D)
A 变量a的地址值
B 无意义
C 变量p的地址值
D 3
3.下列数据结构使用内存空间最小的是 (B)
A.struct Channel {int ChannelIndex; float ChannelProtocol; };
B.union U_Info { char x;float y;int v;};
C.char Red[10];
4.unsigned char数据类型表示的数值范围是 (B)
A.-127~128
B.0~255
C.0~256
D.-127~127
5.下列运算符优先级最高的是(C)
A.&&
B.||
C.!
6.在C语言中,实参与其对应的形参各占独立的存储单元(A)
A.正确
B.不正确
7.下列哪个编译指令属于条件编译指令 (C)
A #include
B #define
C #else
D #pragma
8.下面4个定义中,哪个是错误的 (C)
A char a[9];
B int b[3];
C int n=5, c[n];
D #define N 5 long d[N]
9.程序段 int n=0; while(n=1) n++; while 循环执行的次数是( D)
A 执行0次
B 执行1次;
C 有语法错误,不能执行;
D 执行无限次;
10. 请选择下面程序的输出结果 (A)
main(){
int a[5]={1,2,3,4,5};
int * ptr=(int*)(&a+1); printf(“%d,%d”,*(a+1),*(ptr-1));
}
A 2,5
B 2,1
C 1,5
D 1,1
11.分配内存正确的是 (A)
A char *a=new char[20];
B char a=new char[20];
C char a=new char(20.0);
12.以下哪种变量在栈上分配空间 (D)
A 静态变量
B 通过malloc创建
C 全局变量
D 局部变量
13.下列有关宏替换的描述不正确的是 (A)
A 宏名必须用大写子母表示
B 宏替换不占用运行时间
C 宏替换只是字符替换
D 宏名无类型
14.char s[] = "12345"; int m = sizeof(s); (D)
A 1
B 4
C 5
D 6
15.在32位小端系统中, int a = 0x12345678;unsigned char* pa = (unsigned char*)&a; pa[0]的值是(C)
A 0x1
B 0x12
C 0x78
D 0x8
小端存储:低位存放在低地址(高位存放在高地址) 大端存储:低位存放在高地址(高位存放在低地址)
16.若有定义:int a=7;float x=2.5,y=4.7;则表达式x+a%3*(int)(x+y)%2/4的值是 (A)
A 2.5
B 2.75
C 3.5
D 0
17.判断两个字符串S1和S2相等,应该使用(C)
A if(s1 == s2)
B if(s1 = s2)
C if(!strcmp(s1,s2))
D if(strcmp(s1,s2))
strcmp不是比较两个字符串的长度,是比较两个字符串的ascll码
strcmp函数当s1>s2的时候返回大于0的数
当s1=s2的时候,返回0
当s1
18.下列字符串为合法标识符的是 (A)
A._1_A
B.5_stu
C.$char
D.static
19.下列表达式为true的是 (B)
A 100 > 3 && 'a'>'c'
B 100 > 3 || 'a'>'c'
C !(100>3)
20.若定义:int a[2][3]={1,3,5,7,9,11},以下描述正确的是 (A)
A *(a+1)为元素7的地址
B (a[1]+1)的值是5
C **(a +1)+2值是11
D a[0]和a不同
一维数组和二维数组的关系
1.a[i]==&a[i][0]
2.a[i]+j==&a[i][j]
21.判断变量a中的字符是否为大写字母,最简单的正确表达式是 (A)
A a>=’A’&&a<=’Z’
B A <= a <= Z
C ‘A’ <= a <= ‘Z’
D a >= A && a <= Z
22.若有格式输入函数 scanf("%d%d%d", &x, &y, &z),输入数据时不能使用(B )作为数据的分隔 2分 符。
A 空格
B 逗号
C TAB(制表符)
D 回车
23.void main (void) { 2分
int a[]={4,5,6,7,8};
int *p = a;
*p++=100;
printf(“%d %d\n” , *p,*(++p)); }
程序完成后输出什么?(C)
A 6 6
B 100 6
C 5 6
D 100 5
24.如果变量a是一个数组,a++是否合法. (B)
A 合法
B 不合法
25.若有下列定义,则对 a 数组元素地址的正确引用是( B)。 int a[5],*p=a;
A &a[5]
B p+2
C a++
D &a
27.下面代码的执行后的结果是(A )
int main(){
int x,a=1,b=2,c=3,d=4;
x=(ax)?x:d;
printf(“%d\n”,x);
}
A 1
B 2
C 3
D 4
28.下面程序的输出是(B)
void t_left(int dir){
dir = (dir - 1);
}
void t_right(int *p_dir){
*p_dir = (*p_dir + 1);
}
int main() {
int dir1 = 3, dir2 = 3;
t_left(dir1);
t_right(&dir2);
printf(“%d %d”,dir1,dir2); return 0;
}
A 3 3
B 3 4
C 2 3
D 2 4
29.C库函数中malloc依赖下面哪个系统调用增长堆空间? (C)
A open
B ioctl
C sbrk
D write
30.下面哪种排序法对12354最快 (B)
A quick sort
B bubble sort
C merge sort
31.下列静态成员的特性中( B )是错误的
A. 静态数据成员要在类体外进行定义
B. 静态数据成员不是所有对象所共有的
C. 说明静态成员时,要加修饰符 static
D. 引用静态数据成员时,要在静态数据成员名前加<类名::>
【解析】静态数据成员是类的成员,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用。
32、重载函数在调用时选择的依据(B)是错误的
A. 参数的顺序
B. 参数的返回值类型
C. 参数的个数
D. 参数的类型
【解析】函数返回值类型可以相同也可以不同
33、在下面有关析构函数的描述中,正确的是( C )
A. 析构函数名与类名完全相同
B. 一个类中可以定义多个析构函数
C. 析构函数不能指定返回类型
D. 析构函数可以有一个或多个参数
【解析】析构函数没有参数,也没有返回类型,仅有析构函数,不存在重载函数
34、关于new运算符的下列描述中,( B )是错的。
A. 使用它创建的对象或对象数组可以使用delete运算符删除
B. 使用它创建对象数组,必须指定初始值
C. 它可以用来动态创建对象和对象数组
D. 使用它创建对象时要调用构造函数
【解析】使用new创建对象数组或一般数组时,不能为该数组指定初始值,其初始值为默认值
35、下列关于构造函数的论述中,不正确的是( D )
A. 构造函数可以设置默认参数
B. 构造函数可以重载
C. 构造函数的函数名与类名相同
D. 构造函数的返回类型缺省为int
【解析】来自这篇博客的解析C++(基础)每日一题 9_下列静态数据成员的特性中,( )是错误的 a.引用静态数据成员时,要在静态数据成员名_清和的院子的博客-CSDN博客
a).构造函数在实例化对象时自动被调用,且在每个对象的生命期仅被调用一次。
b) 可以被重载。
c).若程序员没有主动给类定义构造函数,编译器自动给””.个缺省的构造函数。
d).旦程序员定义了 一个构造函数,系统将不会再给出缺省构造函数。
e).除了系统缺省的构造函数外,只要构造函数无参或者参数有缺省值,编译器会认为它就是缺省构造函数。 缺省的构造函数同时只能有1个。
36.下列关于静态数据成员的描述中正确的是(B)
A 静态数据成员是类的所有对象所共有的
B 静态数据成员要在构造函数内初始化
C 类的每个对象有自己的静态数据成员
D 静态数据成员不能通过类的对象调用
【解析】
作者:牛客957538674号
链接:https://www.nowcoder.com/exam/test/71866724/submission?pid=48310137&pageSource=testHistory
来源:牛客网
A:该选项是正确的。静态数据成员是编译阶段就分配好内存的,不管这个类创建了多少个对象,静态成员只有一个拷贝,这个拷贝被所有属于这个类的所有对象共享
B:该选项是错误的。静态成员变量必须在类中声明,在类外初始化。类内初始化会报错。注意:也可以通过构造函数初始化,但不建议,因为如果通过类名方式来访问静态成员变量,由于没有创建对象,也就不会调用构造函数,自然静态成员变量就做不到初始化要求。
C:该选项是错误的。静态数据成员只有一份拷贝,被该类的所有对象所共享。
D:该选项是错误的。静态成员变量或静态成员函数,都有两种方式访问。第一种:通过实例化对象进行访问。第二种:通过类名直接访问。
37.下列有关重载函数的说法中正确的是(C)
A 重载函数必须具有不同的返回值类型
B 重载函数参数个数必须相同
C 重载函数必须有不同的形参列表
D 重载函数名可以不同
38.在C++语言中,数据封装要解决的问题是(D)
A 数据的规范化
B 便于数据转换
C 避免数据丢失
D 防止不同模块之间数据的非法访问
39.void set(Sample& a),则Sample& a的含义是(B)
A 指向类Sample的名为a的指针
B a是类Sample的对象引用,用来作函数Set()的形参
C 将a的地址赋给变量Set
D 变量Sample与a按位与的结果作为函数Set的参数
40.假定一个类的构造函数为A(int aa,int bb){a=aa++;b=a*++bb;},则执行A x(5,5);语句 后,x.a和x.b的值分别为(C)
A 5和5
B 5和25
C 5和30
D 25和5
41.派生类的对象可以访问以下那种情况继承的基类成员 (D)
A 私有继承的私有成员
B 公有继承的私有成员
C 私有继承的保护成员
D 公有继承的公有成员
【解析】无论是什么继承方式,派生类的对象只能访问基类中的公有成员。
42.下列关于析构函数描述正确的是 (D)
A 可以重载
B 函数体中必须有delete语句
C 返回类型必须是void类型
D 不能指定返回类型
43.对基类和派生类的关系描述中,错误的是 (B)
A 派生类是基类的具体化
B 基类继承了派生类的属性
C 派生类是基类定义的延续
D 派生类是基类的特殊化
44.假设Class Y:public X,即类Y是类X的派生类,则说明一个Y类的对象时和删除Y类对象时,调用构造函数和析构函数的次序分别为(A)
A X,Y;Y,X
B X,Y;X,Y
C Y,X;X,Y
D Y,X;Y,X
45.假定AA为一个类,a()为该类公有的函数成员,x为该类的一个对象,则访问x对象中函数成员a()的格式为(B)
A x.a
B x.a()
C x->a
D (*x).a()
【解析】:对象访问成员的方式为:对象名.成员。指针可以有两种:(*对象指针).成员或者对
象指针->成员。A选项是访问数据成员,B项是访问成员函数。
46.要禁止修改指针p本身,又要禁止修改p所指向的数据,这样的指针应定义为 (D)
A const char *p=“ABCD”;
B char *const p=“ABCD”;
C char const *p=“ABCD”;
D const char * const p=“ABCD”;
47.关于类模板的说法正确的是: ()
A 类模板的主要作用是生成抽象类
B 类模板实例化时,编译器将根据给出的模板实参生成一个类
C 在类模板中的数据成员具有同样类型
D 类模板中的成员函数没有返回值
48.下列函数模板的定义中,合法的是 (A)
A template
B template class
C template T
D template T abs(T x){return x<0 ?-x:x;}
49.有如下程序:
#include
using namespace std;
class Sample
{
friend long fun(Sample s);
public:
Sample(long a ) {x=a;}
private:
long x;
};
long fun(Sample s)
{
if(s.x<2)
return 1;
return s.x*fun(Sample(s.x -1));
}
int main()
{
int sum=0;
for(int i=0;i<6;i++){sum+=fun(Sample(i));}
cout<
【解析】
sum=0
i=0 sum+=1 sum=1
i=1 sum+=1 sum=2
i=2 sum+=2*1 sum=4
i=3 sum+=3*(2*1) sum=10
i=4 sum+=4*(3*2*1) sum=34
i=5 sum+=5*(4*3*2*1) sum = 154
50.观察下面一段代码
class ClassE{
public:
virtual 〜ClassE(){};
virtual void FunctionE(){};
};
class ClassF{
public:
virtual void FunctionF(){};
};
class ClassG : public ClassE, public ClassF{}; ClassG aObject; //语句1
ClassE* pE=&aObject;
ClassF* pF=&aObject;
ClassG* pG=&aObject;
关于pE,pF,pG的取值,下面的描述中正确的是(C)。
A pE,pF,pG的取值相同
B pG=pE+pF
C pE和pF不相同
D pG不等于pE也不等于pF
51.观察下面一段代码
class ClassE{
public:
virtual 〜ClassE(){};
virtual void FunctionE(){};
};
class ClassF{
public:
virtual void FunctionF(){};
};
class ClassG : public ClassE, public ClassF{}; ClassG aObject; //语句1
ClassE* pE=&aObject;
ClassF* pF=&aObject;
ClassG* pG=&aObject;
ClassE* pE2;
下面正确的代码是(D)
A pE2=static_cast
B void*pVoid=static_cast
C pE2=pF;
D pE2=static_cast
52.观察下面一段代码。
class ClassE{
public:
virtual 〜ClassE(){};
virtual void FunctionE(){};
};
class ClassF{
public:
virtual void FunctionF(){};
};
class ClassG : public ClassE, public ClassF{};
ClassG aObject; //语句1
ClassE* pE=&aObject;
ClassF* pF=&aObject;
ClassG* pG=&aObject;
ClassE* pE2;
将语句1改为如下代码
ClassG aObject=new ClassG; 则下面哪一个语句是不安全的(B)
A delete pE
B delete pF
C delete pG
【个人解析】基类的析构函数要声明为虚函数,否则当使用基类的指针释放派生的对象时,派生类对象只会释放基类的部分,造成内存泄露
53.在下列关于类型转换的描述中,错误的是(A)
A 任何形式的构造函数都可以实现数据类型转换
B 带非默认参数的构造函数可以把基本类型数据转换成类类型对象
C 类型转换函数可以把类类型对象转换为其他指定类型对象
D 类型转换函数只能定义为一个类的成员函数,不能定义为类的友元函数
54.在C++中,为了让某个类只能通过new来创建(即如果直接创建对象,编译器将报错),应该()
A 将构造函数设为私有
B 将析构函数设为私有
C 将构造函数和析构函数均设为私有
55.给出下面定义: char a[]=”abcd”;char b[]={‘a’,’b’,’c’,’d’}; 则下列说法正确的是(C )
A 数组a与数组b等价
B 数组a和数组b的长度相同
C 数组a的长度大于数组b的长度
D 数组a的长度小于数组b的长度
56.一个类的友元函数可以访问类的( D)成员。
A 私有成员
B 保护
C 公有
D 其他都正确
57.设置虚基类的声明中,正确的是( B)
A 简化程序
B 消除二义性
C 提高运行效率
D 减少目标代码
58.决定C++语言中函数的返回值类型的是(D )
A return语句中的表达式类型
B 调用该函数时系统随机产生的类型
C 调用该函数时的主调用函数类型
D 在定义该函数时所指定的数据类型
59.为了提高程序的运行速度,可将不太复杂的功能用函数实现,此函数应选择( A)
A 内联函数
B 重载函数
C 递归函数
D 函数模板
60. this指针存在的目的是( C)
A 保证基类私有成员在子类中可以被访问
B 保证基类保护成员在子类中可以被访问
C 保证每个对象拥有自己的数据成员,共享处理这些数据成员的代码
D 保证基类公有成员在子类中可以被访
61.已知:char a ; float b ; double c ; 则执行语句:c = a + b + c; 后变量c的类型为(D )
A char
B float
C int
D double
62.设已有说明语句“in a=5;”,则执行语句“a+=a*=a%=3;”后,a的值为 ( A)
A 8
B 18
C 0
D 2
63.下列情况中,不会调用拷贝构造函数的是( B)
A 用一个对象去初始化同一类的另一个新对象时
B 将类的一个对象赋值给该类的另一个对象时
C 函数的形参是类的对象,调用函数进行形参和实参结合时
D 函数的返回值是类的对象,函数执行返回调用时
解析:拷贝构造函数是一个特殊的构造函数,它用一个已知的对象初始化一个正在创建的同类对象,它的一般格式是:类名::类名(const类名&引用对象名)。当一个类的对象赋值给该类的另一个对象时,是赋值而不是创建对象,所以不会调用拷贝构造函数。
64.其中存在语法错误的是(D )
class Foo {
public:
Foo(int v) : value(v) {} //1 ~Foo(){}
private:
Foo(){} //2
int value = 1; //3
static int type = 0; //4
};
A 1
B 2
C 3
D 4
65.若运行程序,请选出表达正确的选项。(CD)
#include
using namespace std;
int main() {
int a=9;
auto fun1=[=]{return ++a;};//代码片段1
auto fun2=[&]{return ++a;};//代码片段2
auto fun2=[=]()mutable{return ++a;};//代码片段3
return 0;
}
A 代码片段2运行错误。 B 代码片段3运行错误。 C 代码片段3运行正确。 D 代码片段1报错,编译报错,error: increment of read-only variable ‘a’ |
66.若运行程序,请选出表达正确的选项(ABCD)
#include
using namespace std;
int main() {
int a=9;
auto fun1=[=]()mutable{return ++a;};
cout<<"fun1:"<
A 打印的结果里面包含了如下语句: fun1:10
B 打印的结果里面包含了如下语句: a:9
C 打印的结果里面包含了如下语句: 0 fun2:10
D 打印的结果里面包含了如下语句: 1 fun3:11
func1:10
a:9
func2:10
func3:10
++a执行后:a=10
func2:10 (9+1=10)
func3:11 (10+1=11)
64.auto_ptr 类使用必须满足下列限制:( ABCD)
A 不要使用 auto_ptr 对象保存指向静态分配对象的指针
B 不要使用两个 auto_ptrs 对象指向同一对象
C 不要使用 auto_ptr 对象保存指向动态分配数组的指针
D 不要将 auto_ptr 对象存储在容器中
65.可以使用memset,memcpy直接进行初始化和拷贝的有:( ABD)
A 结构
B 枚举
C 类实例
D 指针
66.2个同名成员函数,可以重载的是(BC )
A int A::f() 和double A::f()
B void A::f(int) 和void A::f(short)
C void A::f() 和void A::f() const
D void A::f(int) 和void A::f(const int)
67.若有以下定义:“int x[2][3];”,能正确表示x数组元素地址的表达式是(BD )
A &x[2][3]
B x[0]
C x[2]
D x[1]
68.若有如下的定义 ,则下列表达式中,正确的是(ABD)
class sam{
public:
int num;
void print(){cout< < num;}
}x,*p=&x;
A (*p).print( )
B p->num=10
C p.num
D x.num=5
69.两个线程并发执行以下代码,假设a是全局变量,那么以下输出(ABCD)哪个是可能的
int a=1;
void foo(){
++a;
printf("%d",a);
}
A 3 2
B 2 3
C 3 3
D 2 2
70.下列哪两个数据结构,同时具有较高的查找和删除性能?(CD)
A 有序数组
B 有序链表
C AVL树
D Hash 表
71.正确的是(AC)
char a = 'a';
int b = static_cast(a);//语句A
double *c = new double;
void *d = static_cast(c);//语句B
int e = 10;
const int f = static_cast(e);//语句C
const int g = 20;
int *h = static_cast(&g);//语句D
class Base {};
class Derived : public Base {}
Base* pB = new Base();
if(Derived* pD = static_cast(pB)) {}//语句E
Derived* pD = new Derived();
if(Base* pB = static_cast (pD)) {}//语句F
A 语句ABCF正确
B 语句ADE正确
C 语句DE错误
D 语句ABCD正确
72.问题描述:
将两个从小到大排序好的列表合并成一个新的从小到大排序的列表 ,请用链表方式实现。
输入描述: 两个从小到大排序好的有符号整型列表(假定两个列表的分别有10个有符号整型数据)
输出描述: 按从小到大排序好的合并数据列表
输入样例:
2 4 7 8 10 33 44 55 56 60
1 3 6 11 15 21 47 49 50 51
输出样例:
1 2 3 4 6 7 8 10 11 15 21 33 44 47 49 50 51 55 56 60
#include
#include
#include
#define InputArraySize 10
void ArrayMerge (int Array1[], int Array1Size, int Array2[], int Array2Size, int Array3[]) {
int m = 0, n = 0;
int TotalSize = Array1Size + Array2Size;
if (Array1Size < 0 || Array2Size < 0)
return;
else if (Array1Size == 0 || Array2Size == 0) {
for (int i = 0; i < Array1Size; i++)
Array3[i] = Array1[i];
for (int i = 0; i < Array2Size; i++)
Array3[i] = Array2[i]; }
for (int i = 0; i < TotalSize; i++) {
int temp1 = m > Array1Size-1 ? INT_MAX : Array1[m]; int temp2 = n > Array2Size-1 ? INT_MAX : Array2[n];
if (temp1 <= temp2) {
Array3[i] = temp1;
if (m > Array1Size)
n++;
else
m++;
}
else {
Array3[i] = temp2; n++;
}
}
return;
}
int main () {
int *Array1, *Array2, *Array3;
int TotalSize = InputArraySize * 2;
Array1 = (int *)malloc (sizeof (int) * InputArraySize); Array2 = (int *)malloc (sizeof (int) * InputArraySize); Array3 = (int *)malloc (sizeof (int) * TotalSize);
for (int i = 0; i < InputArraySize; i++)
scanf ("%d", Array1 + i);
for (int i = 0; i < InputArraySize; i++)
scanf ("%d", Array2 + i);
ArrayMerge (Array1, InputArraySize, Array2, InputArraySize, Array3);
for (int i = 0; i < 19; i++)
printf ("%d ", Array3[i]);
printf ("%d\n", Array3[19]);
free (Array1);
free (Array2);
free (Array3);
return 0;
}
73.问题描述:
有n(n 小于50)个人围成一圈,顺序排号。从第一个人开始循环报数(从1到4报数),凡报到2的人退出圈子,问最后留下的是原来第几号的 那位。
#include
void main()
{
int n;
// printf("请输入这一圈人的数量:\n");
scanf("%d",&n); //code body start
//code body end
}
输入描述: 小于50的一个整数
输出描述: 小于或等于输入的一个整数
输入样例: 5
输出样例: 4
#include
void main()
{
int num[50],n,*p,j,loop,i,m,k;
// printf("请输入这一圈人的数量:\n");
scanf("%d",&n);
p=num;
for (j=0;j