一、前言
本部分为C++语言刷题系列中的第4节,主要讲解两个知识点:内联函数和new&delete运算符。欢迎大家提出意见、指出错误或提供更好的题目!
二、知识点讲解
2.1内联函数
概念:所谓内联函数,就是编译器在编译时使用该函数的目标代码来替换对该函数的调用,即在程序运行时直接执行其目标代码,根本就不存在函数调用了。
引入内联函数的原因在于均衡时间效率和空间效率。函数调用会节省一些内存空间,但是也会花费一些额外的运行时间(执行函数调用的入栈成本和出栈成本)。因此,当函数代码非常短时,这种以时间换取空间的行为可能不划算。在这种情况下,可以告诉编译器进行优化操作,即采用函数的目标代码来取代原来的函数调用。
知识点1:C++语言中,采用inline关键字告诉编译器,尽量将此函数编译成内联函数。需要注意的是,编译器会根据函数体的实际情况自动取消不值得的内联函数。
知识点2:在类的声明中实现了的成员函数,默认都是内联函数。
2.2 new&delete运算符
概念:在C语言中,采用malloc和free函数实现动态内存分配,即让程序员在需要内存时进行按需分配,在使用完内存时释放内存。而在C++语言中,引入了new和delete运算符来实现动态内存管理。
知识点1:malloc函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。并且malloc返回值的类型是void *,需要显式地进行类型转换,即将void * 转换成所需要的指针类型。
例如:分配存放10整数的内存空间:int *p=(int*)malloc(sizeof(int)*10);
知识点2:new运算符内置了sizeof、类型转换和类型安全检查功能,直接返回相应数据类型的指针,即不需要进行类型转换。并且,new运算符在动态创建对象时,还能同时完成对象的初始化工作,即调用对象的构造函数。
例如:int *p=new int[10];
知识点3:delete运算符释放new运算符分配的内存空间,同理也会调用对象的析构函数。需要注意的是:当要释放对象数组时,留意不要丢了符号'[]'。
例如:Student *p1=new Student(); delete p; p=NULL;
Student *p2=new Student[10]; delete [] p; p=NULL;
三、试题解析
1、下列关于内联函数的叙述中,错误的是( )。
A. 内联函数的定义必须出现在内联函数第一次被调用之前
B. 内联函数主要解决程序的运行效率问题
C. 类体中定义的函数都是内联函数
D. 内联函数必须通过关键字inline来定义
正确答案:D
解析:因为编译器会采用函数体来替代函数调用,所以内联函数的函数定义必须出现在内联函数第一次被调用之前,A是对的。内联函数可以避免函数频繁调用时的开销,提高程序运行效率,B是对的。在类定义体内部定义的成员函数,编译器都将其视为内联函数,C是对的。由C可知,是内联函数也可以不用inline关键字来定义,并且采用inline关键字定义的函数也不一定是内联函数,故D是错误的。
2.有如下类定义:
class Box
{
public:
double GetLength() { return length; }
double GetWidth();
double GetHeight();
private:
double length,width,height;
};
inline double Box::GetWidth() { return width; }
double Box::GetHeight() { return height; }
在成员函数 GetLenth、GetWidth 和 GetHeight 中,内联函数有()。
A.3个
B.2个
C.1个
D.0个
正确答案:B
解析:在类体中定义的成员函数,C++系统会自动将它们作为内联函数处理,而在类外定义的成员函数,系统并不把它们默认为内联函数,但是可以使用inline关键字来告诉编译器将其作为内联函数,只需要在声明成员函数或定义成员函数之一使用inline关键字声明即可。所以本题共有2个内联函数GetLength和GetWidth,B选项正确。
3.下列关于new运算符的叙述中,错误的是( )。
A.new运算符用于申请动态存储空间
B.new运算符返回指向操作数类型变量的指针
C.使用new运算符创建类对象时会调用类的构造函数
D.使用new运算符创建数组时必须为数组元素指定初值
答案:D
解析: new运算符用于申请动态存储空间,返回指向操作数类型变量的指针,使用new运算符创建类对象时会调用类的构造函数,使用new运算符创建数组时必须为数组元素个数,因此选项D错误。
4.下列关于delete运算符的叙述中,错误的是( )。
A.delete运算符可以作用于空指针
B.使用delete运算符释放类对象时要调用该类的析构函数
C.由new运算符分配的内存空间必须通过delete运算符释放
D.使用delete运算符释放动态分配的单个对象和对象数组的语法格式相同
正确答案:D
解析:使用new分配的内存,需要使用delete释放;使用new[]分配的数组内存,需要使用delete[]释放。使用delete释放空间,会调用对象的析构函数,但如果指针为空指针的话,则不作任何处理。Delete[]中的[]的作用于此告诉系统这是个数组,需要调用每个元素的析构函数。因此,delete运算符释放动态分配的单个对象和对象数组的语法格式不同相同。故答案为D。
四、试题测试
1.一个函数功能不太复杂,但要求被频繁调用,应选用( )。
A.内联函数
B.重载函数
C.递归函数
D.嵌套函数
2.下列有关内联函数的叙述中,正确的是( )。
A.内联函数在调用时发生控制转移
B.内联函数必须通过关键字inline来定义
C.内联函数是通过编译器来实现的
D.内联函数函数体的最后一条语句必须是return语句
3.对于new类型名[size]描述正确的是( )。
A.申请可以存储size个字节的空间
B.申请可以存储1个该数据类型的空间
C.申请可以存储size个该数据类型对象的空间
D.申请可以存储1个字节的空间
3.使用new创建的对象,对其生命周期描述正确的是( )。
A.由系统决定
B.由用户控制
C.全局生命周期
D.永久存在
4.运算符delete与哪个函数一起运行( )。
A.构造函数
B.析构函数
C.主函数
D.不与任何函数一起工作
5.下列关于new运算符的描述中,( )是错误的。
A.它可用来动态创建对象
B.使用它创建的对象必须使用delete运算符删除
C.使用它创建对象时自动调用构造函数
D.使用它创建对象时必须指定初始值
------------------------------
欢迎大家提出意见、指出错误或提供更好的题目,只有大家的共同努力,才能帮助更多人掌握C++的基本概念,顺利通过考试!