一、前言
本部分为C++语言刷题系列中的第2节,主要讲解两个知识点:const关键字和引用。欢迎大家提出意见、指出错误或提供更好的题目!
二、知识点讲解
2.1const关键字
概念:在C++语言中,可以使用const关键字来定义常量,即在程序运行期间其值不能发生变化。
const double PI=3.1415927;
特别注意的是:数据类型和const的位置可以互换,即
double const PI=3.1415927;
知识点1:因为常量在定义后就不能被修改,所以它必须被初始化,未初始化的常量定义将导致编译错误。
const double PI; // 错误: 常量PI没有被初始化
知识点2:定义常量指针,即该指针在运行期间不能再指向其它的存储空间。
int a=10, b=20;
int * const p=&a;
p=&b; // 错误: 常量指针p指向变量a后,不能再指向其它任何整型变量
知识点3:定义指向常量的指针,即通过该指针不能修改其所指向存储空间的值。
int a=10;
const int * p=&a;
*p += 20; // 错误: 变量a相对于指针p来讲,相当于一个常量,不能通过P来修改
有关知识点2和知识点3的理解可看后续的文章。
2.2引用
概念:在C++语言中,引用被称之为变量的别名(alias)。
例如:int m;
int &n = m;
其中,n相当于m的别名(绰号),对n的任何操作就是对m的操作。
这样说起来容易,但在做题时却帮助不大。为方便大家做题,可以这样理解:引用是C++编译器自动间接引用的常量指针,即其本质上是一个常量指针,但程序员可以像变量一样使用,这两者之间的差异是由编译器自动完成的(更深的理解可看后续的文章)。例如:
int m;
int &n = m;
n = 10;
编译器编译后,相当于:
int * const n = &m;
*n = 10;
知识点1:引用被创建的同时必须被初始化,并且一旦被初始化,就不能改变引用的关系。因为是常量指针呀。
int &n; //编译时会报错
知识点2:按引用传递参数,本质上也是按指针传递。不要被以变量使用的方式欺骗了。
三、试题解析
1.下列语句中错误的是( )。
A.const int *p = 0;
B.const int y = 99;
C.const int x;
D.const int *p = new int(100);
正确答案:C
解析:c++定义const类型变量时必须初始化,否者编译不通过,所以c选项错误
2.有如下函数定义:
void test(int a, int &b){ a++; b++; }
若执行代码段:
int x=0, y=1;
test(x, y);
则变量x和y的值分别是( )。
A.0和1
B.1和1
C.0和2
D.1和2
正确答案:C
解析:参数传递有三种:传值、传指针和传引用。本题中实参x为传值方式,所以x的值不会改变,y为引用形参,所以会改变。故本题答案为C.
3.有如下程序:
#include <iostream>
using namespace std;
void test(int &a,______)
{
int c=a; a=b; b=c;
}
void main()
{
int x=1, y=2;
test(x,y);
cout<<x<<y;
}
运行后的输出结果是21,则横线处的语句应为( )。
A.int b
B.int *b
C.int &b
D.b
正确答案:C
答案解析:main函数中定义两个整型变量x=1,y=2,由输出x,y的结果为21,可知函数test的功能是交换两个实参的值。由于函数test中未使用指针类型的变量,所以若想通过函数test交换实参的值,形参类型必然为引用类型,横线处语句为int &b,答案为C。
4.有如下程序:
#include <iostream>
using namespace std;
int fun1(int x) { return ++x; }
int fun2(int &x) { return ++x; }
void main()
{
int a=0, b=0, c=0;
c=fun1(a)+fun2(b);
cout<<a<<b<<c<<endl;
}
运行后的输出结果是( )。
A.002
B.012
C.102
D.112
正确答案:B
解析:程序定义了两个函数,fun1和fun2,功能都是对形参x自增1,然后返回自增后的值。其中fun2的形参x为引用类型,形参x自增1的同时实参的值也自增1。main函数中定义三个整型变量a=0,b=0,c=0,调用fun1(a)返回值为1,调用fun2(b)返回值为1,同时实参b的值被修改为1,所以c的值为1+1=2,程序输出a、b、c为0,1,2;答案为B。
四、试题测试
1.下列表达式,哪一是声明P为指向常量的指针( )。
A.const int *p
B.int* const p;
C.const int *const p;
D.int *p
2.下列语句中,错误的是( )。
A.const int buffer=256;
B.const double *point;
C.int const buffer=256;
D.double * const point;
3.已知int型变量y的初值是5,但在执行语句"f(y);"后,y的值被改变,因此该语句所调用函数的原型是( )。
A.void f(int x);
B.void f(int *x);
C.void f(const int *x);
D.void f(int &x);
4.已知函数ff的原型为
void ff(int &a, char *b);
变量x、y的定义是
int x; char y;
则下列调用该函数的语句中正确的是( )。
A. ff(x, &y);
B. ff(x, y);
C. ff(&x, &y);
D. ff(&x, y);
-------------------------------------------------------
欢迎大家提出意见、指出错误或提供更好的题目,只有大家的共同努力,才能帮助更多人掌握C++的基本概念,顺利通过考试!
2 / 2