【C++初阶】10 .习题①

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【C++初阶】10 .习题①

2022-09-16_命名空间

1. 命名空间的概念

下面关于C++命名空间描述错误的是( )【不定项选择】
A.命名空间定义了一个新的作用域。
B.std是C++标准库的命名空间。
C.在C++程序中,命名空间必须写成using namespace std;
D.我们可以自己定义命名空间。

【答案解析】C
==A.命名空间主要解决名字冲突,其作用就是定义一个新的作用域==
B.std是标准命名空间
C.还有std::xx 和using std::xx来使用标准库中的用法,所以不是必须写using namespace std
D.可以通过namespace space_name{};定义自己新的命名空间

2. 引用的概念

关于引用以下说法错误的是( )。(阿里巴巴2015笔试题)
A.引用必须初始化,指针不必
B.引用初始化以后不能被改变,指针可以改变所指的对象
C.不存在指向空值的引用,但是存在指向空值的指针
D.一个引用可以看作是某个变量的一个“别名”
E.引用传值,指针传地址
F.函数参数可以声明为引用或指针类型

答案解析
A.引用必须初始化,必须在定义引用时明确引用的是哪个变量或者对象,否则语法错误,指针不初 始化时值为随机指向
B.引用一旦定义时初始化指定,就不能再修改,指针可以改变指向
C.引用必须出示化,不能出现空引用,指针可以赋值为空
D.简单粗暴的引用理解可以理解为被引用变量或对象的"别名"
==E.引用表面好像是传值,其本质也是传地址,只是这个工作有编译器来做,所以错误==
(在博客:C++入门中提到,对于引用的底层也是通过指针实现的)
F.函数调用为了提高效率,常使用引用或指针作为函数参数传递变量或对象

2022-09-21_类的定义

3. class和struct的区别

在C++中的结构体是否可以有成员函数?( )
A.不可以,结构类型不支持成员函数
B.可以有
C.不可以,只有类允许有成员函数

【答案解析】B
C语言结构体不支持成员函数,但C++结构体支持,==其实class与struct本质没有区别,唯一区别在于默认时class的访问属性为私有,struct为公有==

4. this指针

this指针可以为空嘛?

【答案解析】可以,单纯的对this赋空是不可以的,不过可以强转直接赋空,不过一般不进行这样的操作

5. 构造/析构顺序

设已经有A,B,C,D4个类的定义,程序中A,B,C,D析构函数调用顺序为?( )

C c;
int main()
{
    
    
    A a;
    B b;
    static D d;
    return 0;
}

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

【答案解析】B
1、类的析构函数调用一般按照构造函数调用的相反顺序进行调用,但是要注意static对象的存在,因为static改变了对象的生存作用域,需要等待程序结束时才会析构释放对象
2、全局对象先于局部对象进行构造
3、局部对象按照出现的顺序进行构造,无论是否为static
4、所以构造的顺序为 c a b d
5、析构的顺序按照构造的相反顺序析构,只需注意static改变对象的生存作用域之后,会放在局部对象之后进行析构
6、因此析构顺序为B A D C

6. 拷贝构造函数特点

拷贝构造函数的特点是( )
A.该函数名同类名,也是一种构造函数,该函数返回自身引用
B.该函数只有一个参数,是对某个对象的引用
C.每个类都必须有一个拷贝初始化构造函数,如果类中没有说明拷贝构造函数,则编译器系统会自动生成一个缺省拷贝构造函数,作为该类的保护成员
D.拷贝初始化构造函数的作用是将一个已知对象的数据成员值拷贝给正在创建的另一个同类的对象

【答案解析】D
A.拷贝构造函数也是一构造函数,因此不能有返回值
B.该函数参数是自身类型的对象的引用
==C.自动生成的缺省拷贝构造函数,作为该类的公有成员,否则无法进行默认的拷贝构造==
为啥自动生成的一定是缺省拷贝构造函数呢?因为拷贝构造函数是一定要带参数的
D.用对象初始化对象这是拷贝构造函数的使命,故正确

2022-10-09_构造函数和析构函数

7. 前置++/后置++(运算符重载)

已知表达式++a中的"++"是作为成员函数重载的运算符,则与++a等效的运算符函数调用形式为( )
A.a.operator++()
B.a.operator++(0)
C.a.operator++(int)
D.operator++(a,0)

【答案解析】A
A.正确
==B.operator++()传递了整形参数(对于前置++是不能传递参数的),故为后置++,错误==
C.调用函数传递类型,导致语法错误
D.参数过多,语法错误

2022-10-10_构造函数初始化列表

8. 初始化列表的初始化对象

有一个类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

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

2022-10-12_构造函数初始化列表

9. 友元函数性质

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

【答案解析】 D
A.==友元函数不是类的成员函数==,就相当于你的朋友再亲密也不是你的家人
==既然不是类成员函数,那和普通成员函数调用一样,不需要通过对象调用==
B.友元的目的就是为了访问类的私有数据,成员函数可以直接访问类的私有数据
C.类的成员函数属于类,调用时其内部数据会通过this指针来调用
==D.友元函数不具备this指针,更谈不上通过this调用,故错误==

10. 日期累加

在这里插入图片描述

2022-10-13_数据内存分布

11. 内存管理分配堆栈

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

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

12. malloc和new的区别

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

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

13. delete内置类型

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

【答案解析】B
==对于内置类型,此时delete就相当于free,因此不会造成内存泄漏==
编译不会报错,建议针对数组释放使用delete[],如果是自定义类型,不使用方括号就会运行时错误

2022-10-17_ 模板

14. 采用模板的原因

下面有关C++中为什么用模板类的原因,描述错误的是? ( )
A.可用来创建动态增长和减小的数据结构
B.它是类型无关的,因此具有很高的可复用性
C.它运行时检查数据类型,保证了类型安全
D.它是平台无关的,可移植性

【答案解析】C
==A.模板可以具有非类型参数,用于指定大小,可以根据指定的大小创建动态结构==
B.模板最重要的一点就是类型无关,提高了代码复用性
==C.模板运行时不检查数据类型,也不保证类型安全,相当于类型的宏替换,故错误==
D.只要支持模板语法,模板的代码就是可移植的

15. 模板概念

下列关于模板的说法正确的是( )
A.模板的实参在任何时候都可以省略
B.类模板与模板类所指的是同一概念
C.类模板的参数必须是虚拟类型的
D.类模板中的成员函数全是模板函数

【答案解析】D
A.不一定,参数类型不同时有时需要显示指定类型参数
==B.类模板是一个类家族,模板类是通过类模板实例化的具体类==
C.C++中类模板的声明格式为template<模板形参表声明><类声明>,并且类模板的成员函数都是模板函数
==D.正确,定义时都必须通过完整的模板语法进行定义==

16. 模板声明的正确形式

下列的模板声明中,其中几个是正确的( )
1) template
2) template
3) template
4) template
5) template
6) template
7) template
8)

【答案解析】 4 6 7
1.模板语法错误
2.没有关键字class或typename指定类型,
3.T2缺少class或typename
4,6,7为正确声明
5.T2缺少class或typename
8.缺少template

2022-10-26_string的特性及使用

17. c_str的作用

关于代码输出正确的结果是()(vs2013环境下编译运行)

int main(int argc, char* argvl)
{
    
    
    string a = "hello world"; 
    string b = a;
    if (a.c_str() == b.c_str()) 
    {
    
    
        cout << "true" << endl;
    }
    else cout << "false" << endl;
    string c = b;
    c = "";
    if (a.c_str() == b.c_str()) 
    {
    
    
        cout << "true" << endl;
    }
    else cout << "false" << endl; a = "";
    if (a.c_str() == b.c_str()) 
    {
    
    
        cout << "true" << endl;
    }
    else cout << "false" << endl; return 0;
}

【答案解析】A
a 和 b的值虽然相同,==但是a.c_str()==b.c_str()比较的是存储字符串位置的地址,a和b是两个不同的对象,内部数据存储的位置也不相同== 因此不相等,后面c="",a=""与b对象都没有任何的影响,所以都不相等

18. reserve缩小

下面程序的输出结果正确的是( )

int main() {
    
    
    string str("Hello Bit."); 
    str.reserve(111);
    str.resize(5); 
    str.reserve(50);
    cout << str.size() << ":" << str.capacity() << endl; 
    return 0;
}

【答案解析】C
str.reserve(111); //调整容量为 111
str.resize(5); //调整元素个数为 5
==str.reserve(50); //调整容量为 50,由于调整的容量小于已有空间容量,故容量不会减小==
所以size = 5 capacity = 111
在这里插入图片描述
==如果reserve 的值小于vector原先的容量, 不会更改的==

19. 数据越界的判断

在这里插入图片描述
【答案解析】

/*
*思路:
* 1. 要考虑正负数
* 2. 要考虑数据是否溢出
*/
class Solution {
   
   
public:
    int StrToInt(string str)
    {
   
   
        int len = str.size();
        int flag = 1;
        if (len == 0)
            return 0;
        const char* cstr = str.c_str();
        if (cstr == NULL)
            return 0;
        int i = 0;
        if (cstr[i] == '+')
        {
   
   
            i++;
            flag = 1;//如果str[i]为'+',str[i]顺序后移,并令标志flag为1,表示为正数   
        }
        else if (cstr[i] == '-')
        {
   
   
            i++;
            flag = -1;//如果str[i]为'-',str[i]顺序后移,并令标志flag为-1,表示为负数   
        }
        long long num = 0;
        while (cstr[i] != '\0')
        {
   
   
            if (cstr[i] >= '0' && cstr[i] <= '9')
            {
   
   
                //每遍历一个在0-9间的字符,就将其输入到num中       
                num = num * 10 + (cstr[i] - '0');//下一次输入到num中时要加上上一次*10的结果,即上一次的数左移一位(十进制下) 
                //如果数据溢出,则返回0
                if ((flag > 0 && num > 0x7fffffff) || (flag < 0 && num>0x80000000))
                    return 0;
                i++;
            }
            else
            {
   
   
                return 0;
            }
        }
        if (flag < 0)
           num = num * -1;
        return (int)num;
    }
};

在这里插入图片描述

20. 添加链接描述

在这里插入图片描述

相关文章
|
3天前
|
存储 算法 C++
【C++数据结构——查找】二分查找(头歌实践教学平台习题)【合集】
二分查找的基本思想是:每次比较中间元素与目标元素的大小,如果中间元素等于目标元素,则查找成功;顺序表是线性表的一种存储方式,它用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的元素在物理存储位置上也相邻。第1次比较:查找范围R[0...10],比较元素R[5]:25。第1次比较:查找范围R[0...10],比较元素R[5]:25。第2次比较:查找范围R[0..4],比较元素R[2]:10。第3次比较:查找范围R[3...4],比较元素R[3]:15。,其中是顺序表中元素的个数。
99 66
【C++数据结构——查找】二分查找(头歌实践教学平台习题)【合集】
|
3天前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
113 75
|
3天前
|
存储 C++
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
32 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
3天前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
25 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
|
3天前
|
算法 C++
【C++数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】
【数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】 目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:实现二叉排序树的基本算法。 相关知识 为了完成本关任务,你需要掌握:二叉树的创建、查找和删除算法。具体如下: (1)由关键字序列(4,9,0,1,8,6,3,5,2,7)创建一棵二叉排序树bt并以括号表示法输出。 (2)判断bt是否为一棵二叉排序树。 (3)采用递归方法查找关键字为6的结点,并输出其查找路径。 (4)分别删除bt中关键
31 11
【C++数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】
|
3天前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
35 18
|
3天前
|
存储 人工智能 算法
【C++数据结构——图】最短路径(头歌教学实验平台习题) 【合集】
任务描述 本关任务:编写一个程序,利用Dijkstra算法,实现带权有向图的最短路径。 相关知识 为了完成本关任务,你需要掌握:Dijkst本关任务:编写一个程序,利用Dijkstra算法,实现带权有向图的最短路径。为了完成本关任务,你需要掌握:Dijkstra算法。带权有向图:该图对应的二维数组如下所示:Dijkstra算法:Dijkstra算法是指给定一个带权有向图G与源点v,求从v到G中其他顶点的最短路径。Dijkstra算法的具体步骤如下:(1)初始时,S只包含源点,即S={v},v的距离为0。
33 15
|
3天前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
30 13
|
3天前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
29 12
|
3天前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
27 10