优秀的编程知识分享平台

网站首页 > 技术文章 正文

C++学习刷题2--常量和引用(c++对常量也可以建立引用)

nanyue 2024-08-10 18:34:56 技术文章 11 ℃

一、前言

本部分为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

Tags:

最近发表
标签列表