众所周知,在c++中,static和const的使用方法是难点,也是重点,值得咱们随时温习,所谓温故而知新是也。html
下面咱们首先说一说static。c++
一、static的做用安全
static变量的做用,主要能够概括为如下几点函数
a、能够隐藏,若是在函数体外声明成员变量,非static的成员变量,在A.cpp中声明:int a;那么这样其余源文件好比B.cpp是能够访问到A.cpp中的a的。这样极容易混淆,由于咱们可能须要在B.cpp中声明int a;并且也是对数据的一种保护,使A更安全。this
而若是在A.cpp中声明的是:static int a;那么只能在该文件中访问了,在B.cpp中访问不到a.这也间接的实现了封装的效果。不少时候对于咱们数据的设计是很是有好处的。spa
b、声明为static的变量还具有持久性,这里说的持久性就是不依靠对象的改变而存在与否,由于static是属于整个类的,他的声明周期是源程序存在的声明周期,不会觉得某个对象new而产生而后delete而消失。这是static的一个很是重要的特性,甚至是最重要的特性。由于对于某些数据须要全体用户共享的时候,static无疑是一种很是棒的解决方案。设计
c、默认初始化。咱们知道非static变量在全局变量中是会进行初始化的,可是在局部变量中,好比函数体内部是不会初始化的。可是static变量则否则,他会在全部状况下进行初始化。如static int a;a会初始化为0.指针
类中static的做用。rest
static 数据成员必须在内定义的外部进行定义,在类定义体中定义是错误的。code
而应该在函数体外部定义
1 double Accout::interestRate=0.09; 2 double Accout::getNum(){ 3 return interestRate; 4 }
类中静态成员函数
不能访问非静态函数或者变量。由于静态成员函数是属于类而不是某个对象,可是非静态函数和变量是属于某个对象的。因此静态不能访问非静态。
可是反过来,非静态是能够访问静态的。毕竟静态是一直存在,属于整个类。相信这个应该是很是容易理解的。
static函数中不能使用this关键字,由于this通常指当前对象,而static不属于任何对象。
不能声明为virtual虚函数,虚函数的主要做用是实现多态,你们想象一下static。多态对static是没有意义的,他压根不属于对象呀!
static函数比普通函数访问的速度快不少。这个能够解释为普通函数须要首先访问当前对象,而后再访问当前对象的成员函数。这之间有多步转化,他能快的过static函数么?
固然static关键字和普通成员或者函数都听从private,public,protected访问规则的。
const用法
const直观的理解就是常量且不可修改。可是const的意义远不止如此,下面让咱们一一解剖:
const int a=30;
常量:a必须赋值,不赋值是不被容许的。试想若是不赋值,又由于const不可修改性,那么a定义有意义吗?这也是const变量必须赋予初始值得直接缘由。
既然是常量,那么是否是想到了常常用到的
#define a 30;
确实,上述语句也可以使a是常量。是否是const和define就是等价的呢?至少在这个用法上是等价的呢?
固然不是,在程序运行是#define a 30;出现a只是简单的用30来代替,出现屡次就代替屡次。重复这样的过程会出现多个副本的产生,可是const就不会出现这种状况,永远保持一个副本;其次define也不能定义数据类型啊。
这里再讲define须要注意的一个微小细节:
#define fun(x) (x*x);
程序中出现fun(5),会用(5*5)替换
可是出现fun(5+6),只会用(5+6*5+6)代替。而不是(11*11).
因此咱们尽可能少用define,多用const和inline内联函数。
const指针用法:
咱们这里说两种指针,常量指针和指向常量的指针。以下:
指向常量的指针能够经过x改变,而后p中指向的值也改变了。
可是相似*p=40;这样修改是不被容许的。
const参数和返回值
表示返回的参数应该是const。const参数则表示该传过去的参数是不可修改的。
说到这里当函数返回指针的时候,必定不能返回局部变量,由于函数在退出的时候,函数中的栈空间也清除了(局部变量会存储在该空间中)。返回的已经不是咱们须要获得的了,极可能返回乱码。
class中const使用。
const 数据成员。成员只能在构造函数中初始化,不能在类声明外初始化和static有比较大区别。
类中的函数例如 void fun()const;表示不可改变当前对象。不可改变当前对象能够理解为,不能对当前对象中的成员进行左值操做!
总结:static,const,const static初始化总结:
static在class声明外初始化。
const在构造函数中初始化,若没有构造函数就悲剧了。
const static和static const同样,在类外初始化。
1 class Accout{ 2 public: 3 Accout(); 4 static double interestRate; 5 const static double a; 6 const double c; 7 int b; 8 };
1 const double Accout::a=9; 2 double Accout::interestRate=0.09; 3 Accout::Accout():c(5){}
转载请注明出处:http://www.cnblogs.com/xiaoyi115/p/3622891.html
不足之处敬请指正!