const(常量)

2015/05/05 C和C++基础

const是C语言的一个关键字,它所限定变量不允许改变。使用const可以在一定程度上增强程序的健壮性,减少程序出错。虽然const有诸多优势,但是const的使用却并不简单。

7.找错–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;    //错
	
	a1=&c;  //对
	*a1=1;  //错
	
	a2=&c;  //错
	*a2=1;  //对

	a3=&c;  //错
	*a3=1;  //错
	
	return 0;
}
8.请说明const与#define的各自特点以及区别

解析:

#define只是用来做文本替换,例如:

#define PI 3.1415926
float angel;
angel=30*PI/180;

当程序进行编译的时候,编译器会首先将#define PI 3.1415926以后所有代码中的“PI”全部换成3.1415926,然后在进行编译。因此#define常量的声明周期止于编译期,它存在于程序的代码段,在实际程序中它只是一个常数,一个命令中的参数,并没有实际的存在。

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

静态检查:书中对静态检查的阐述:“编译器必须检查源程序是否符合源语言规定的语法和语义要求。”由此看来,静态检查其实就是语义分析了。

类型错误:将int赋给一个指针就是类型错误。

类型检查:检查类型错误,属于静态检查的一部分,编译器实现可能有两种情况:第一种是将中间代码生成、类型检查放到语法分析一起做,完成语法分析的同时进行语义分析。对于某些复杂的结构,则将类型检查作为语法分析和中间代码生成之间单独的一遍。

强类型语言:某语言的编译器保证所接受的程序不会在运行时发生“类型错误”,则此语言是强类型语言。

类型安全语言:将int赋给一个指针,C/C++会编译器会抱错,于是C/C++称为类型安全语言.。似乎“类新安全”和“强类型”本质上一样。
9.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();            //error
const char *ch=GerChar();      //correct

4.const修饰类的成员函数(函数定义体):任何不需要修改数据成员的函数都应该使用const修饰,这样即使不小心修改了数据成员或调用了非const成员函数,编译器也会报错。const修饰类的成员函数形式为:

int GetCount(void) const;

Search

    Post Directory