
🫧个人主页:小年糕是糕手
💫个人专栏:《C++》《C++同步练习》《数据结构》《C语言》
🎨你不能左右天气,但你可以改变心情;你不能改变过去,但你可以决定未来!
目录
一、命名空间
知识回顾:
- 本质:一个 "名字容器",隔离不同模块的标识符(变量、函数、类等)。
- 核心目的 :避免命名冲突(比如两个库都有
print()函数,用命名空间区分)。- 基本用法 :
- 用
namespace 命名空间名 { ... }定义;- 用
命名空间名::标识符访问内部成员(如std::cout);- 可通过
using namespace 命名空间名简化访问(避免重复写前缀,但全局使用可能再次引入冲突)。
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{ };定义自己新的命名空间
二、缺省参数
知识回顾:
- 本质:函数定义时给参数指定默认值,调用时可省略该参数。
- 核心目的:简化函数调用,增强函数灵活性(同一函数适配不同传参场景)。
- 基本用法 :
- 定义函数时写
类型 参数名=默认值(如void func(int a=10) { ... });- 调用时,可传参(
func(20))或省略(func(),自动用默认值 10)。- 规则 :
- 缺省参数需从右往左连续设置(不能中间空着);
- 同一函数的缺省参数不能多次定义(声明和定义只能一处指定)。
- 给的缺省参数要从左至右依次赋值
1、下面关于C++缺省参数描述错误的是()A.缺省参数是声明或定义函数时为函数的参数指定一个默认值.
B.在调用有缺省参数的函数时,如果没有指定实参则采用该默认值,否则使用指定的实参
C.C和C++都支持缺省参数
D.全缺省就是参数全部给缺省值,半缺省就是缺省一半的值
答案:CD
解析:
A:缺省参数就是给出的函数参数的默认值
B:很明显,这是给出缺省值的意义所在
C:纯C语言,即.c文件,函数不支持缺省参数,C++即.cpp文件支持
D:半缺省不能随便缺省一半,必须从右往左缺省,否则编译出错
三、函数重载
知识回顾:
- 本质:同一函数名对应多个 "参数列表不同" 的函数实现,是同名函数的多态形式。
- 核心目的:简化函数调用(不用记多个函数名),让同名函数适配不同参数场景。
- 基本用法 :
- 定义多个函数名相同、参数列表(类型 / 个数 / 顺序)不同的函数;
- 调用时,编译器自动根据传入参数匹配对应版本(如
add(1,2)匹配 int 版,add(1.5,2.5)匹配 double 版)。- 规则 :
- 返回值类型不影响重载匹配;
- 避免与缺省参数混用,防止出现匹配歧义。
1、以下不是double compare(int,int)的重载函数的是()A.int compare(double,double)
B.double compare(double,double)
C.double compare(double,int)
D.int compare(int,int)
答案:D
解析:
A:参数类型不同构成函数重载
B:参数类型不同构成函数重载
C:参数类型不同构成函数重载
D:函数重载不能依靠返回值的不同来构成重载,因为调用时无法根据参数列表确定调用哪个重载函数,故错误
2、下面关于函数重载描述错误的是()A.构成函数重载的条件是函数名相同就可以
B.重载的函数参数可以相同
C.重载的函数返回值可以相同
D.C和C++都支持函数重载
答案:ABD
解析:
A:函数名相同只是函数重载的条件之一
B:重载函数必须参数列表有所不同(包括参数类型和参数个数)
C:重载函数不依靠返回值来区分,所以返回值可以相同
D:C不支持函数重载
四、引用
知识回顾:
- 本质:变量的 "别名",与原变量共享同一块内存空间,不额外占用存储资源。
- 核心目的:简化指针操作、避免数据拷贝(提升效率),同时安全地传递函数参数 / 返回值。
- 基本用法 :
- 定义格式:
类型& 引用名 = 原变量(如int a=10; int& b=a;,b 是 a 的别名);- 必须在定义时初始化(不能存在 "空引用"),初始化后不可修改指向其他变量。
- 规则 :
- 对引用的操作等价于对原变量的操作(如
b=20会使 a 的值同步变为 20);- 常引用(
const 类型&)可绑定临时值 / 常量(如const int& c=5;),且无法通过引用修改绑定的值;- 引用不能直接绑定到不同类型的变量(需显式类型转换时除外)。
1、关于引用以下说法错误的是()(阿里巴巴2015笔试题)A.引用必须初始化,指针不必
B.引用初始化以后不能被改变,指针可以改变所指的对象
C.不存在指向空值的引用,但是存在指向空值的指针
D.一个引用可以看作是某个变量的一个"别名"
E.引用传值,指针传地址
F.函数参数可以声明为引用或指针类型
答案:E
解析:
A:引用必须初始化,必须在定义引用时明确引用的是哪个变量或者对象,否则语法错误,指针不初始化时值为随机指向
B:引用一旦定义时初始化指定,就不能再修改,指针可以改变指向
C:引用必须初始化,不能出现空引用,指针可以赋值为空
D:简单粗暴的引用理解可以理解为被引用变量或对象的"别名"
E:引用表面好像是传值,其本质也是传地址,只是这个工作由编译器来做,所以错误
F:函数调用为了提高效率,常使用引用或指针作为函数参数传递变量或对象
2、"引用"与指针的区别是什么()A.指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指 针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作
B.引用通过某个引用变量指向一个对象后,对它所指向的变量间接操作。程序中使用引用,程序的可读性差;而指针本身就是目标变量的别名,对指针的操作就是对目标变量的操作
C.指针比引用更节省存储空间
D.以上都不正确
答案:A
解析:
A:指针是间接操作对象,引用时对象的别名,对别名的操作就是对真实对象的直接操作,故正确
B:很显然,答案刚好相反
C:指针需要开辟空间,引用不需要开辟空间,故错误
D:A正确,故D错误
3、关于引用与指针的区别,下面叙述错误的是()A.引用必须被初始化,指针不必
B.指针初始化以后不能被改变,引用可以改变所指的对象
C.删除空指针是无害的,不能删除引用
D.不存在指向空值的引用,但是存在指向空值的指针
答案:B
解析:
A:引用必须定义时初始化,指针不初始化其值为随机指向
B:指针可以改变指向,引用不能,故错误
C:空指针没有任何指向,删除无害,引用是别名,删除引用就删除真实对象
D:引用必须初始化,所以不能为空引用,指针可以
五、inline
知识回顾:
- 本质:编译器将函数调用处直接替换为函数体代码的 "特殊函数",避免函数调用的开销。
- 核心目的:提升小函数(如简单计算、取值)的执行效率,平衡代码复用与性能。
- 基本用法 :
- 定义时在函数前加
inline关键字(如inline int add(int a, int b) { return a+b; });- 直接像普通函数一样调用(如
int c = add(1,2);),编译器会尝试在调用处展开代码。- 规则 :
inline是 "建议" 而非强制,编译器可根据函数复杂度(如包含循环、递归)忽略内联请求;- 内联函数的定义通常需放在头文件中(避免链接错误);
- 不适合复杂 / 长函数(会导致代码膨胀,反而降低性能)。
1、在()情况下适宜采用 inline 定义内联函数A.函数体含有循环语句
B.函数体含有递归语句
C.函数代码少、频繁调用
D.函数代码多,不常调用
答案:C
解析:
A:含有循环语句,违背内联函数的本质
B:含有递归语句,违背内联函数的本质
C:尽可能把代码短小,频繁调用的函数设置为内联函数
D:含代码量大,违背内联函数的本质
内联函数是一种建议,如果函数内部包括循环,递归,或者 代码量大且复杂,这些函数即使设置了内联函数,系统也不会当做内联函数来处理。
2、关于c++的inline关键字,以下说法正确的是()A.使用inline关键字的函数会被编译器在调用处展开
B.头文件中可以包含inline函数的声明
C.可以在同一个项目的不同源文件内定义函数名相同但实现不同的inline函数
D.递归函数也都可以成为inline函数
答案:C
解析:
A:不一定,因为inline只是一种建议,需要看此函数是否能够成为内联函数
B:inline函数不支持声明和定义分离开,因为编译器一旦将一个函数作为内联函数处理,就会在调用位置展开,即该函数是没有地址的,也不能在其他源文件中调用,故一般都是直接在源文件中定义内联函数的
C:inline函数会在调用的地方展开,所以符号表中不会有inline函数的符号名,不存在链接冲突
D:比较长的函数,递归函数就算定义为inline,也会被编译器忽略,故错误
六、nullptr
知识回顾:
- 本质:C++11 引入的强类型空指针常量,专门用于表示 "空指针",区别于 NULL。
- 核心目的 :解决 NULL 本质是
(void*)0导致的类型歧义(如重载函数匹配错误),让空指针表示更精准、安全。- 基本用法 :
- 直接用于初始化指针或给指针赋值(如
int* p = nullptr; char* q = nullptr;);- 替代 NULL,避免类型转换带来的问题(如
if (p == nullptr)判断指针是否为空)。- 规则 :
- nullptr 类型是
nullptr_t,可隐式转换为任意指针类型,但不能转换为非指针类型(如 int);- 优先使用 nullptr 而非 NULL(C++11 及以上标准),兼容所有指针类型,无歧义;
- NULL 在 C++ 中通常定义为
0或(void*)0,可能导致重载匹配错误(如同时有func(int)和func(int*)时,func(NULL)会匹配func(int))。
注:这篇博客以及这个专栏是帮助大家同步学习C++所开的另一个独立的专栏文章,希望大家学完C++专栏相关内容再来同步学习这部专栏加强巩固
