C++ 笔试题 (3)——每天学一点,天天都进步

本文深入探讨了C++中的类成员,特别是构造函数、静态成员、引用和常量的初始化。强调了常量和引用必须通过初始化列表初始化,静态成员的外部初始化,以及构造函数的执行顺序。此外,还讲解了堆栈内存管理,包括new和malloc的区别,以及动态内存分配和释放的注意事项。最后,涉及了析构函数的调用顺序和友元函数的功能,以及内存区域和变量大小的相关知识。
摘要由CSDN通过智能技术生成
  1. 有一个类A,其数据成员如下: 则构造函数中,成 变量一定要通过初始化列表来初始化的是:( )
class A {
...
private:
   int a;
public:
   const int b;
   float* &c;
   static const char* d;
   static double* e;
};

A.a b c
B.b c
C.b c d e
D.b c d
E.b
F.c

答案解析

A.a是不同数据成员,可以通过构造函数进行赋值
B.正确,常量以及引用只能通过初始化列表初始化
C.d,e是静态成员,只能在类外初始化
D.d是静态成员,只能在类外初始化
E.b常量只能通过初始化列表初始化,但不是最佳答案
F.c引用只能通过初始化列表初始化,但不是最佳答案。

  1. 下面程序的运行结果是( )?
class A
{
public:
  A(int a)
    :_a1(a)
    ,_a2(_a1)
  {}
  void Print()
  {
    cout<<_a1<<" "<<_a2<<endl;
  }
private:
  int _a2;
  int _a1;
}
int main()
{
  A aa(1);
  aa.Print();
}

A.输出1 1
B.程序崩溃
C.编译不通过
D.输出1 随机值

答案解析:

A.初始化顺序由定义类时的声明顺序决定,所以先初始化_a2,由于初始化_a2时_a1还未初始化,所以为随机值
B.程序可以正常运行
C.能编译通过
D.正确

  1. 在一个cpp文件里面,定义了一个static类型的全局变量,下面一个正确的描述是:( )
    A.只能在该cpp所在的编译模块中使用该变量
    B.该变量的值是不可改变的
    C.该变量不能在类的成员函数中引用
    D.这种变量只能是基本类型(如int,char)不能是C++类型

答案解析

A.正确,static限制了变量具有文件域
B.static变量是可以被改变的
C.可以被正常访问使用,以及通过成员来进行引用
D.静态变量也可以是自定义类型的变量

  1. 关于C++类中static 成员和对象成员的说法正确的是( )
    A.static 成员变量在对象构造时生成
    B.static 成员函数在对象成员函数中无法调用
    C.static 成员函数没有this指针
    D.static 成员函数不能访问static 成员变量

答案解析:

A.static成员变量在对象生成之前生成
B.普通成员函数是可以调用static函数的
C.static函数属于所有对象共享,不具备this指针
D.static函数唯一能够访问的就是static变量或者其他static函数

  1. 下面程序段包含4个函数,其中具有隐含this指针的是( )
int f1();
class T
{
  public:static int f2();
  private:friend int f3();
  protect:int f4();
};

A.f1
B.f2
C.f3
D.f4

答案解析

A.全局函数不具备this指针
B.static函数不具备this指针
C.友元函数不具备this指针
D.正确,普通成员方法具有隐藏的this指针

  1. 下面有关友元函数与成员函数的区别,描述错误的是?( )
    A.友元函数可以让本类和友元类对象调用
    B.友元函数和类的成员函数都可以访问类的私有成员变量或者是成员函数
    C.类的成员函数是属于类的,调用的时候是通过指针this调用的
    D.友元函数是有关键字friend修饰,调用的时候也是通过指针this调用的

答案解析

A.友元函数相当于全局函数,可以直接被调用
B.友元的目的就是为了访问类的私有数据,成员函数可以直接访问类的私有数据
C.类的成员函数属于类,调用时其内部数据会通过this指针来调用
D.友元函数不具备this指针,更谈不上通过this调用,故错误

  1. 一个类的友元函数能够访问类的( )
    A.私有成员
    B.保护成员
    C.公有成员
    D.所有成员

答案解析

A.可以访问,这也把一个函数声明为友元的目的
B.可以访问
C.可以访问
D.友元函数对一个类里面的所有成员,全部通吃

  1. 下面有关c++内存分配堆栈说法错误的是( )
    A.对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制
    B. 对于栈来讲,生长方向是向下的,也就是向着内存地址减小的方向;对于堆来讲,它的生长方向是向上的,是向着内存地址增加的方向增长
    C.对于堆来讲,频繁的 new/delete 势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题
    D.一般来讲在 32 位系统下,堆内存可以达到4G的空间,但是对于栈来讲,一般都是有一定的空间大小的

答案解析

A.栈区主要存在局部变量和函数参数,其空间的管理由编译器自动完成,无需手动控制,堆区是自己申请的空间,在不需 要时需要手动释放
B.栈区先定义的变量放到栈底,地址高,后定义的变量放到栈顶,地址低,因此是向下生长的,堆区则相反
C.频繁的申请空间和释放空间,容易造成内存碎片,甚至内存泄漏,栈区由于是自动管理,不存在此问题
D.32位系统下,最大的访问内存空间为4G,所以不可能把所有的内存空间当做堆内存使用,故错误

  1. C++中关于堆和栈的说法,哪个是错误的:( )
    A.堆的大小仅受操作系统的限制,栈的大小一般较小
    B.在堆上频繁的调用new/delete容易产生内存碎片,栈没有这个问题
    C.堆和栈都可以静态分配
    D.堆和栈都可以动态分配

答案解析

A.堆大小受限于操作系统,而栈空间一般有系统直接分配
B.频繁的申请空间和释放空间,容易造成内存碎片,甚至内存泄漏,栈区由于是自动管理,不存在此问题
C.堆无法静态分配,只能动态分配
D.栈可以通过函数_alloca进行动态分配,不过注意,所分配空间不能通过free或delete进行释放

  1. c++语言中,类ClassA的构造函数和析构函数的执行次数分别为( )
ClassA *pclassa=new ClassA[5];
		delete pclassa;

A.5,1
B.1,1
C.5,5
D.程序可能崩溃

答案解析

申请对象数组,会调用构造函数5次,delete由于没有使用[],此时只会调用一次析构函数,但往往会引发程序崩溃,要想完整释放数组空间,需要使用[]

  1. 下面有关malloc和new,说法错误的是? ( )
    A.new 是创建一个对象(先分配空间,再调构造函数初始化), malloc分配的是一块内存
    B.new 初始化对象,调用对象的构造函数,对应的delete调用相应的析构函数,malloc仅仅分配内存,free仅仅回收内存
    C.new和malloc都是保留字,不需要头文件支持
    D.new和malloc都可用于申请动态内存,new是一个操作符,malloc是是一个函数

答案解析

A.new会申请空间,同时调用构造函数初始化对象,malloc只做一件事就是申请空间
B.new/delete与malloc/free最大区别就在于是否会调用构造函数与析构函数
C.需要头文件malloc.h,只是平时这个头文件已经被其他头文件所包含了,用的时候很少单独引入,故错误
D.new是操作符,malloc是函数

  1. 设已经有A,B,C,D4个类的定义,程序中A,B,C,D析构函数调用顺序为? ( )
C c;
void main()
{
  A*pa=new A();
  B b;
  static D d;
  delete pa;
}

A.A B C D
B.A B D C
C.A C D B
D.A C B D

答案解析:

首先手动释放pa, 所以会先调用A的析构函数,其次C B D的构造顺序为 C D B,因为先构造全局对象,再构造局部静态对象,最后才构造普通对象,然而析构对象的顺序是完全按照构造的相反顺序进行的,所以答案为 B

  1. 使用 char* p = new char[100]申请一段内存,然后使用delete p释放,有什么问题?( )
    A.会有内存泄露
    B.不会有内存泄露,但不建议用
    C.编译就会报错,必须使用delete []p
    D.编译没问题,运行会直接崩溃

答案解析

A.对于内置类型,此时delete就相当于free,因此不会造成内存泄漏
B.正确
C.编译不会报错,建议针对数组释放使用delete[],如果是自定义类型,不使用方括号就会运行时错误
D.对于内置类型,程序不会崩溃,但不建议这样使用

以下代码中,A 的构造函数和析构函数分别执行了几次: ( )

A*pa=new A[10];
delete []pa;

A.1、1
B.10、10
C.1、10
D.10、1

答案解析

A.申请数组空间,构造函数调用的次数就是数组的大小
B.正确
C.申请数组空间,构造函数调用的次数就是数组的大小
D.如果释放数组空间,delete使用了[],则会对应的调用数组大小次数的析构函数

  1. 变量所在哪个内存区域以及变量所占空间大小是多少?
int globalVar = 1;
static int staticGlobalVar = 1;
void Test()
{
static int staticVar = 1;
int localVar = 1;
int num1[10] = {1, 2, 3, 4};
char char2[] = "abcd";
char* pChar3 = "abcd";
int* ptr1 = (int*)malloc(sizeof (int)*4);
int* ptr2 = (int*)calloc(4, sizeof(int));
int* ptr3 = (int*)realloc(ptr2, sizeof(int)*4);
free (ptr1);
free (ptr3);
}
  1. 选择题:
    选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)
    globalVar在哪里?____ staticGlobalVar在哪里?____
    staticVar在哪里?____ localVar在哪里?____
    num1 在哪里?____
    char2在哪里?____ *char2在哪里?___
    pChar3在哪里?____ *pChar3在哪里?____
    ptr1在哪里?____ *ptr1在哪里?____

  2. 填空题:
    sizeof(num1) = ____;
    sizeof(char2) = ____; strlen(char2) = ____;
    sizeof(pChar3) = ____; strlen(pChar3) = ____;
    sizeof(ptr1) = ____;

答题
globalVar在哪里?C staticGlobalVar在哪里?C
staticVar在哪里?C localVar在哪里?A
num1 在哪里?A
char2在哪里?A *char2在哪里?D
pChar3在哪里?A *pChar3在哪里?D
ptr1在哪里?A *ptr1在哪里?B
分析:

globalVar是全局变量在数据段
staticGlobalVar是静态全局变量在静态区
staticVar是静态局部变量在静态区
localVar是局部变量在栈区
num1是局部变量在栈区
char2局部变量在栈区
char2是一个数组,把后面常量串拷贝过来到数组中,数组在栈上,所以*char2在栈上
pChar3局部变量在栈区 *pChar3得到的是字符串常量字符在代码段
ptr1局部变量在栈区 *ptr1得到的是动态申请空间的数据在堆区

  1. 填空题:

sizeof(num1) = 40;//数组大小,10个整形数据一共40字节

sizeof(char2) = 5;//包括\0的空间

strlen(char2) = 4;//不包括\0的长度

sizeof(pChar3) = 4;//pChar3为指针

strlen(pChar3) = 4;//字符串“abcd”的长度,不包括\0的长度

sizeof(ptr1) = 4;//ptr1是指针,在32位操作系统下为四字节

未完,待续。。。

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿是小贺

谢谢老板的厚爱,感谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值