第二章 从C到C++ 课后习题
一、名词解释引用:所谓引用,就是给对象取一个别名,使用该别名可以存取该对象。换句话说是使新对象和原对象共用一个地址。这样,无论对哪个对象进行修改,其实都是对同一地址的内容进行修改。因而原对象和新对象(规范的说,是对象和它的引用)总是具有相同的值。
内联函数:内联函数是使用inline关键字声明的函数,也称内嵌函数,它主要是解决程序的运行效率。
重载函数:重载函数指在同一个作用域内名字相同而参数不同的函数。重载函数通常用来对具有相似行为而数据类型或数据个数 不同的操作提供—个通用的名称。
二、填空题(1)一般情况下,用C++语言编写的程序是由 函数 加上 类型 组成的。
(2)C++有两种注释符号,一种是 // ,另一种是 /*......*/ 。
(3) 使用C++风格的输人输出,在程序中必须包含头文件 “ iostream ”。
(4) cin 是预定义的标准输人流对象, >> 是输人操作符,也称提取运算符。
(5) cout 是预定义的标准输出流对象, << 是输出操作符,也称插人运算符。
(6)指针的值是它所指向那个对象的 地址值 。指针的类型是它所指向对象的 类型 。指针的内容便是它所指向对象的 值 。
(7)C++使用运算符 & 来定义一个引用,对引用的存取都是对它所引用的 对象 的存取。
(8)当一个函数调用出现在函数定义之前时,必须先用函数原型对函数进行 声明 。
(9)C++有 值传递 和 引用传递 两种参数传递机制。
(10)使用关键字 inline 声明的函数称为内联函数。
(11)运算符 new 用于进行动态内存分配,运算符 delete 用于释放动态分配的内存。
(12)下面程序的输出结果为 x=10,y=10;x=100,y=100 。
三、选择题(至少选一个,可以多选)
(1)在整型指针变量p2、p3的定义中,错误的是( A )。
A.int pl,* p2,p3; B.int * p2,p1,* p3;C.int pl,* p2=&p1,*p3; C.int * p2,p1,* p3=&p1;
(2)若有定义“double x x=3.14,*pp=&x x;”,则*pp等价于( C )。A.&x x B.*x x C.3.14 D.x x
(3)下面对引用的描述中( C )是错误的。A.引用是某个变量或对象的别名 B.建立引用时,要对它初始化
C.对引用初始化可以使用任意类型的变量 D.引用与代表的对象具有相同的地址
(4)函数没有返回值得时候,应该选择( A )函数类型。A.void B.int C.不确定 D.float
(5)在函数的定义格式中,下面各组成部分中,( D )是可以省略的。A.函数名 B.函数体 C.返回值类型 D.函数参数
(6) 对重载的函数来说,下面叙述不正确的是( D )。A.参数的类型不同 B.参数的顺序不同
C.参数的个数不同 D.参数的个数、类型、顺序都相同,但函数的返回值类型不同
(7)下列有关设置函数参数默认值的描述中,( D )是正确的。A.对设置函数参数默认值的顺序没有任何规定
B.函数具有一个参数时不能设置默认值
C.默认参数要设置在函数的原型中,而不能设置在函数的定义语句中
D.设置默认参数可使用表达式,但表达式中不可用局部变量
(8) 下面说法正确的是( BC )。A.所有函数都可以说明为内联函数
B.具有循环语句、switch 语句的函数不能说明为内联函数
C.使用内联函数,可以加快程序执行的速度,但会增加程序代码的大小
D.使用内联函数,可以减小程序代码大小,但使程序执行的速度减慢
(9)一个函数功能不太复杂,但要求被频繁调用,应选用( A )。A.内联函数 B.重载函数 C.递归函数 D.嵌套函数
(10)C++对C语言做了很多改进,下列描述中使得C语言发生了质变,即从面向过程变成面向对象的是(D )。A.增加了一些新的运算符 B.允许函数重载,并允许设置默认参数
C.规定函数说明必须用原型 D.引进了类和对象的概念
四、判断题(1)C++程序中,不得使用没有定义或说明的变量。 ( 对)
(2)使用const 说明常量时,可以不必指出类型。 (错 )
(3) 引用被创建时可以用任意变量进行初始化。 (错 )
(4)一个返回引用的调用函数可以作为左值。 (对 )
(5)函数可以没有参数,也可以没有返回值。 (对 )
(6)没有参数的两个函数是不能重载的。 (对 )
(7)函数可设置默认参数,但不允许将一个函数的所有参数都设置为默认参数。 (错 )
(8)运算符new 分配的空间由运算符delete 释放。
五、简答题
(1) 名字空间的定义是什么?
答:C++提供名字空间来防止命名的冲突。
(2)引用有何用处?
答:引用的主要用途是用作函数参数和函数值的返回。
(3)比较值调用和引用调用的相同点与不同点。
答:在值传递机制中,作为实参的表达式的值被复制到由对应的形参名所标识的一个对象中,作为形参的初始值。函数体对形参的访问、修改都是在这个标识对象上的操作,与实参无关,即数据的传递是单向的。使用引用作函数的参数时,调用函数的实参要用变量。实参传递给形参,相当于在被调用函数中使用了实参的别名。于是,在被调用函数中对形参的操作,实质是对实参的直接操作,即数据的传递的双向的。
(4)内联函数有什么作用? 它有哪些特点?
答:内联函数是使用inline关键字声明的函数。在程序编译时,编译系统将程序中出现内联函数调用的地方用函数体进行替换,进减少了程序运行的时间。
内联函数的特点:
①递归函数不能定义为内联函数。
②内联函数一般适合于不含有switch和while等复杂的结构且只有1~5条语句的小函数,否则编译系统将该函数视为普通函数。
③内联函数只能先定义后使用,否则编译系统也将该函数视为普通函数。
④对内联函数不能进行异常接口声明。
(5)函数原型中的参数名与函数定义中的参数名以及函数调用中的函数名必须一致吗?
答:不必一致。所有的参数时根据位置和类型而不是名字来区分的。
(6)重载函数时通过什么来区分?
答:编译系统是将根据函数参数的类型和个数来判断使用哪一个函数。
六、程序分析题(写出程序的输出结果,并分析结果)
#include<iostream>
using namespace std;
int main()
{
int num=50;
int& ref=num;
ref=ref+10;
cout<<"num="<<num<<endl;
num=num+40;
cout<<"ref="<<ref<<endl;
return 0;
}
结果分析如下:
首先定义一个int类型的num,并给其赋初值为50;然后又定义一个int类型的引用ref,并将num的值赋给它。再进行“ref=ref+10”操作是输出的值就是50+10=60,所以输出num的值为60,下面“num=num+40”,这里num的值为上面算出的值60,所以ref的值为60+40=100。
七、程序设计题
写出一个完整的C++程序,使用系统函数pow(x,y)计算x^y的值,注意包含头文件cmath。
程序如下:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
float x,y;
cout<< "pleace input 2 integers to x,y" <<endl;
cin>>x>>y;
float w=pow(x,y);
cout<<"w="<<w<<endl;
return 0;
}