c++new时赋初值_4 C++学习刷题4--内联函数和new&delete运算符

一、前言

本部分为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++的基本概念,顺利通过考试!

577897b993884ad1879c8393b0a8c4e1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C函数是一种与类一起使用的功能。如果一个函数被声明为内的,编译器会将该函数的代码副本放入每个调用该函数的地方。这样可以减少函数调用的开销,提高程序的执行效率。通过指示编译器将函数定义为内函数,可以替代函数的调用,从而在编译进行代码替换,而不是在运行引用函数定义。内函数的主要优势在于它可以减少函数的调用开销,因为函数调用涉及到堆栈操作,而内函数直接展开在调用的地方,避免了函数调用的开销,从而提高程序的执行效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++ 实验1 重载函数和内函数的应用 ](https://download.csdn.net/download/weixin_52516491/88014519)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [C++的内成员函数和内函数](https://blog.csdn.net/wenchm/article/details/130764637)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [c++函数](https://blog.csdn.net/travel_dream/article/details/125921537)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值