static
“static”是用于控制变量的生命周期和连接方式(即其作用域,亦即可见性)的保留字
函数调用的结果不会访问或者修改任何对象(非static)数据成员,这样的成员声明为静态成员函数比较好。且如果static int func(....)不是出现在类中,则它不是一个静态成员函数,只是一个普通的全局函数,只不过由于 static 的限制,它只能在文件所在的编译单位内使用,不能在其它编译单位内使用。
而普通的函数,默认是extern的,也就是说,可以被其它代码文件调用该函数。
因此定义静态函数有以下好处:
<1> 其他文件中可以定义相同名字的函数,不会发生冲突。
<2> 静态函数不能被其他文件所用。
在类中,用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化,对于该类的所有对象来说,static成员变量只有一份。
用static声明的方法是静态方法,在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员
static int fun(int j) {
static int i = j; //i只初始化一次,为5
return ++i; //先++ ,所以i为6,以后每次调用fun时,只执行++i;
}
int main(int argc, char * argv[]) {
int i = 0;
int j = 5;
for (;j != 0; --j) {
i = fun(j); //返回值为 6 7 8 9 10
}
std::cout << i << std::endl;
return 0;
}
例子2:
int func(){
}int main(int argc, char * const argv[])
{ func(); // 输出0
func(); // 输出1
func(); // 输出2
return 0;
}
例子3:
class Request
{
private:
static int count; // 不能为外部调用
string url; // 只能被成员函数调用
public:
Request() { count++; }
string getUrl() const { return url; }
void setUrl(string value) { url = value; }
static int getCount() { return count; }
};
int Request::count = 0; // count 可以在类声明外进行初始化(不能加static),不可以类内初始化
类中的static变量是属于类的,不属于某个对象,它在整个程序的运行过程中只有一个副本,因此不能在定义对象时 对变量进行初始化,就是不能用构造函数进行初始化,其正确的初始化方法是:
数据类型 类名::静态数据成员名=值
const
转载:https://www.cnblogs.com/phpzhou/p/6390869.html
cosnt成员函数主要目的是防止成员函数修改对象的内容。即const成员函数不能修改成员变量的值,但可以访问成员变量。当方法成员函数时,该函数只能是const成员函数。
const数据成员的初始化只能在类的构造函数的初始化列表中进行。要想建立在整个类中都恒定的常量,应该用类中的枚举常量来实现,或者static cosnt
- #ifdef A_H_
- #define A_H_
- #include <iostream>
- using namespace std;
- class A
- {
- public:
- A(int a);
- static void print();//静态成员函数
- private:
- static int aa;//静态数据成员的声明
- static const int count;//常量静态数据成员(可以在构造函数中初始化)
- const int bb;//常量数据成员
- };
- int A::aa=0;//静态成员的定义+初始化
- const int A::count=25;//静态常量成员定义+初始化
- A::A(int a):bb(a)//常量成员的初始化
- {
- aa+=1;
- }
- void A::print()
- {
- cout<<"count="<<count<<endl;
- cout<<"aa="<<aa<<endl;
- }
- #endif
- void main()
- {
- A a(10);
- A::print();//通过类访问静态成员函数
- a.print();//通过对象访问静态成员函数
- }