c++中static和inline关键字
⼀、static变量和static函数
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
答: 1) 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本⾝就是静态存储⽅式, 静态全局变量当然也是静态存储⽅式。 这两者在存储⽅式上并⽆不同。这两者的区别在于⾮静态全局变量的作⽤域是整个源程序, 当⼀个源程序由多个源⽂件组成时,⾮静态的全局变量在各个源⽂件中都是有效的。 ⽽静态全局变量则限制了其作⽤域, 即只在定义该变量的源⽂件内有效, 在同⼀源程序的其它源⽂件中不能使⽤它。由于静态全局变量的作⽤域局限于⼀个源⽂件内,只能为该源⽂件内的函数公⽤, 因此可以避免在其它源⽂件中引起错误。
2) 从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储⽅式即改变了它的⽣存期。把全局变量改变为静态变量后是改变了它的作⽤域,限制了它的使⽤范围。
3) static函数与普通函数作⽤域不同,仅在本⽂件。只在当前源⽂件中使⽤的函数应该说明为内部函数(static),内部函数应该在当前源⽂件中说明和定义。对于可在当前源⽂件以外使⽤的函数,应该在⼀个头⽂件中说明,要使⽤这些函数的源⽂件要包含这个头⽂件
static修饰的变量
综上所述:
static全局变量与普通的全局变量有什么区别:
static全局变量只初始化⼀次,防⽌在其他⽂件单元中被引⽤;
static局部变量和普通局部变量有什么区别:
static局部变量只被初始化⼀次,下⼀次依据上⼀次结果值;
static函数与普通函数有什么区别:
static函数在内存中只有⼀份,普通函数在每个被调⽤中维持⼀份拷贝。
⼆、类中static成员
1.static 成员变量:
static变量属于类所有,⽽不属于类的对象,因此不管类被实例化了多少个对象,该变量都只有⼀个。在这种性质上理解,有点类似于全局变量的唯⼀性。
class CA
{
public:
static int sum;
……
public:
CA();
……
};
int CA::sum=0;//static成员只能在类外进⾏初始化
2.static成员函数
C++会区分两种类型的成员函数:静态成员函数和⾮静态成员函数。这两者之间的⼀个重⼤区别是,静态成员函数不接受隐含的this⾃变量。所以,它就⽆法访问⾃⼰类的⾮静态成员。
在某些条件下,⽐如说在使⽤诸如pthread(它不⽀持类)此类的多线程库时,就必须使⽤静态的成员函数,因为其地址同C语⾔函数的地址兼容。这种铜限制就迫使程序员要利⽤各种解决办法才能够从静态成员函数访问到⾮静态数据成员。
⼀种解决⽅法是:将⼀个参照或者指针作为静态成员函数的⾃变量传递,就是在模仿⾃动传递⾮静态成员函数⾥this⾃变量这⼀⾏为。具体实例如下:
class a
{
public:
static FunctionA(a* _a)
{
_a-> menber = 1;
cout<<_a-> menber<<endl;
_a->f();
}
void f()
{
cout<<"f被调⽤了"<<endl;
}
private:
int menber;
};
前提是这个类要分配了内存空间。其实这⾥就是将⼀个对象指针作为静态成员函数的“this”指针,意在模仿传递⾮静态成员函数⾥的this 指针。
三 inline
1) 产⽣背景
inline这个关键字的引⼊原因和const⼗分相似,inline 关键字⽤来定义⼀个类的内联函数,引⼊它的主要原因是⽤它替代C中
表达式形式的宏定义。
表达式形式的宏定义⼀例:
#define ExpressionName(Var1,Var2) (Var1+Var2)*(Var1-Var2)
这种表达式形式宏形式与作⽤跟函数类似,但它使⽤预编译器,没有堆栈,使⽤上⽐函数⾼效。但它只是预编译器上符号表的简单替换,不能进⾏参数有效性检测及使⽤C++类的成员访问控制。
inline 推出的⽬的,也正是为了取代这种表达式形式的宏定义,它消除了它的缺点,同时⼜很好地继承了它的优点。inline代码放⼊预编译器符号表中,⾼效;它是个真正的函数,调⽤时有严格的参数检测;它也可作为类的成员函数。
2) 具体作⽤
直接在class类定义中定义各函数成员,系统将他们作为内联函数处理; 成员函数是内联函数,意味着:每个对象都有该函数⼀份独⽴的拷贝。
在类外,如果使⽤关键字inline定义函数成员,则系统也会作为内联函数处理;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论