static、const、define的一些理解

来源:互联网 发布:哪个直播软件好 编辑:程序博客网 时间:2024/05/22 00:27

C+实在是太庞大了,实际工程中很多东西使用不上,太久不用就容易忘记。只能记些笔记,方便回顾吧。


关于static

有几个概念先阐述一下:

局部变量指在代码块{}内部定义的变量,只在代码块内部有效(作用域),其缺省的存储方式是自动变量或说是动态存储的,即指令执行到变量定义处时才给变量分配存储单元,跳出代码块时释放内存单元(生命期)。

外部变量指在所有代码块{}之外定义的变量,它缺省为静态变量,编译时分配内存,程序结束时释放内存单元。同时其作用域很广,整个文件都有效甚至别的文件也能引用它。

static的作用主要有俩,改变生命周期、改变作用域用static声明局部变量,使其变为静态存储方式(静态数据区),作用域不变;用static声明外部变量,其本身就是静态变量,这只会改变其连接方式,使其只在本文件内部有效,而其他文件不可连接或引用该变量。


const作用: “只读(readonly)”

1.定义常量

(1)const

修饰变量,以下两种定义形式在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的,readonly。

TYPE const ValueName = value;  

const TYPE ValueName = value;

 

(2)将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义. 

extend const int ValueName = value;

 

2.指针使用CONST

(1)指针本身是常量不可变

char * const pContent;  

const (char*) pContent; 

(2)指针所指向的内容是常量不可变

const char *pContent;  

char const *pContent;  

(3)两者都不可变

const char* const pContent;  

(4)还有其中区别方法,沿着*号划一条线:如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。

3.函数中使用CONST

 

(1)const修饰函数参数

a.传递过来的参数在函数内不可以改变(无意义,因为Var本身就是形参)

void function(const int Var); 

 

b.参数指针所指内容为常量不可变

void function(const char* Var);  

 

c.参数指针本身为常量不可变(也无意义,因为char* Var也是形参)

void function(char* const Var); 

 

d.参数为引用,为了增加效率同时防止修改。修饰引用参数时:

void function(const Class& Var); //引用参数在函数内不可以改变

void function(const TYPE& Var); //引用参数在函数内为常量不可变

 

这样的一个const引用传递和最普通的函数按值传递的效果是一模一样的,他禁止对引用

的对象的一切修改,唯一不同的是按值传递会先建立一个类对象的副本, 然后传递过去,而它直接传递地址,所以这种传递比按值传递更有效.另外只有引用的const传递可以传递一个临时对象,因为临时对象都是const属性, 且是不可见的,他短时间存在一个局部域中,所以不能使用指针,只有引用的const传递能够捕捉到这个家伙.

 

(2)const 修饰函数返回值

const修饰函数返回值其实用的并不是很多,它的含义和const修饰普通变量以及指针的含义基本相同。

a.

const int fun1() //这个其实无意义,因为参数返回本身就是赋值。

 

b.

const int * fun2() //调用时 

const int *pValue = fun2(); //我们可以把fun2()看作成一个变量,即指针内容不可变。

 

c.

int* const fun3() //调用时

int * const pValue = fun2(); //我们可以把fun2()看作成一个变量,即指针本身不可变


关于Define

define是宏定义,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查

有些注意点,宏定义是预处理器展开的,编译器并不能处理,因此符号表里找不到define的字符串的。编译要是出错可能报出的信息不是很确切,尽量用用const代替。另外,define的作用域问题,一般宏的有效性是全局的,可以用#undef 解除。可以参考Effective C++条款3