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
- static、const、define的一些理解
- # IOS 对 static extern const #define 的理解
- 关于“const ”关键字和“static”关键字用法的一些理解
- static,const,inline,define的产生背景
- const, static, define 以及inline的区别
- #define,const ,static 的使用总结
- static、const、extern和define的区别
- 纠结的const(static) 和 define
- 【C语言 C++】简单关键字Register,Const,Static,Volatile,typedef,Define的理解
- static const与#define
- #define inline static const
- static 、const 、 define 、inline
- #define const and static
- PHP中的一些关键字(const static define 等等)
- const,static,extern 的理解
- const 的一些理解
- define的一些小小理解
- Static的一些理解
- git commit
- utf-8和utf-8-sig
- SpringBoot 中针对同一类型的参数,可以用一个类来集中访问
- 计算机网络基础
- Linux下最新版LAMP环境(源码版)搭建详细解读
- static、const、define的一些理解
- 最小路径和
- linux下的简单操作
- PAT甲级 1033. To Fill or Not to Fill (25)
- C++结构中的位字段和共用体
- bmfont的设置
- WebRTC代码目录结构
- 【装载】你有一大堆货物和两条船!
- RBTree——红黑树