【C面试题2】

考点一:const使用时的注意点

#include <stdio.h>
int main()
{
	const int x = 1;
	int b = 10;
	int c = 20;

	const int *a1 = &b;
	int *const a2 = &b;
	const int * const a3 = &b;

	x = 2;     //  (错) const int x  -------》  x是一个常量  不能改变x 的值
	
	a1 = &c;   //  (对)const int *a1 -------> const 在int* 前面 说明指针指向的变量不能改变,即 指正指向常量
	*a1 = 1;   //  (错)不能给常量赋值

	a2 = &c;   //  (错)int *const a2 = &b -------> const 在 int* 后面说明指针不能改变
	*a2 = 1;   //  (对)指针指向的值可以改变

	a3 = &c;   //  (错)const int * const a3 ------> int* 的 前后 都有const 说明指针不能变,指针 指向的值 不能变
	*a3 = 1;   //   (错)
}
考点二:const 与 #define 的特点及区别

例如 #define PI 3.1415926

程序编译的时候,编译器会首先将 #define PI 3.1415926 以后所有代码中的 PI 全部替换成 3.1415926,然后进行编译。

因此 #define 常量是一个 Compile-Time 概念,它的生命周期止于编译期,存在于程序的代码段,在实际程序中,它只是一个命令中的参数,没有实际的存在。


const常量是存在于程序的数据段,并在堆栈分配了空间。const常量是一个 Run-Time 的概念,它在程序中确确实实的存在并可以被调用、传递、const 常量有数据类型,而宏常量没有,编译器可以对 const 进行类型安全检查。

考点三:C++ 中的 const 的理解

(1) const 用于定义 常量:const 定义的常量编译器可以对其进行数据静态类型安全检查。

(2)const修饰函数形参:当输入参数为用户自定义类型和抽象数据类型时,应该将“值传递”改为 “const & 传递”

        可以提高效率。

 例如:

 void fun (A a);

 void fun (A const &a);

 第一个函数效率较低,函数体内产生A类型的临时对象用于复制参数 a ,临时对象的构造,复制,析构过程豆浆消耗时间 

 用引用传递不需要产生临时变量,节省了时间,但是,光引用可能会改变 a,所以要加 const。

(3)const修饰函数的返回值:如 给"指针传递"的返回值加上 const ,则 返回值不能被直接修改,且返回值只能被赋值给加

const修饰的同类指针。

例如:const char * GetChar(void) {};

char *ch = GetChar(); // (错)

const char *ch = GetChar(); // (对)

(4)const 修饰类的成员函数(函数定义体):任何不会修改数据成员的函数都应用 const 修饰,这样,当不小心修改了

数据成员或调用了非 const 成员函数时,编译器都会报错。

const 修饰类的成员函数形式为:

int GetCount(void) const;











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值