C语言中static功能: 隐藏/持久存储(函数之间存储的东西)
C语言中:全局变量、malloc 属于 持久存储的(函数之间都在的)
类的成员是static
(1). 隐藏功能
用private来控制C语言中的隐藏功能.
(2). 持久存储
C语言:全局变量、malloc属于持久存储(函数之间存储的东西)
C++语言:
2.1.何为C++的持久存储?
答: 第一种情况:对象与对象之间存在的东西,是持久存储的
第二种情况:一个类有不同的对象,但是不随对象不同而不同, 也是持久存
储
2.2.若成员是static, 则表示拥有了隐藏和持久存储功能.
#include <iostream>
class A
{
public:
A() { i =0; }
//A():i(0) {}//i是静态成员,只能在定义的地方初始化.
void print() { cout << i << endl; }
void set(int i) { this->i = i; }
private:
static int i; //这个变量实际上在全局,但目前是声明,告诉某个地方有i,但是不知道在哪里,所以需要添加int A::i,否则链接错误.
};
int A::i; //一定要添加,否则程序链接错误 //定义变量i //程序运行成功
//static int A::i //程序出错
//表明只有在这个.cpp文件里访问,但是和类的静态成员访问属性违背,因为静态成员的可能被外部访问,不只在这个.cpp文件访问.
//int A::i = 20; //定义初始化,程序运行正确
int main()
{
A a,b;
a.set(10);
b.print(); //10
return 0;
} //编译出错
#include <iostream>
using namespace std;
class A
{
public:
A() {}
void print() { cout << i << endl; }
void set(int i) { this->i = i; }
static int i;
};
int A::i = 20;
int main()
{
A a,b;
a.set(10);
b.print();
cout << a.i << endl;
cout << A::i << endl;
return 0;
}
#include <iostream>
using namespace std;
class A
{
public:
A() {}
void print() { cout << i << endl; }
void set(int i) { this->i = i; }
private:
static int i;
};
int A::i = 20;
int main()
{
A a,b;
a.set(10);
b.print();
//cout << a.i << endl; //这行肯定是不行的.
//cout << A::i << endl; //还是会去检查i的属性,这行不行
return 0;
}
静态成员函数
#include <iostream>
using namespace std;
class A
{
public:
A() {}
void print() { cout << i << endl; }
void set(int i) { this->i = i; }
//static void say(int ii) { cout << ii << k << endl; } //这样是不行的,静态的函数只能调静态的函数,只能调静态的成员.
//static void say(int ii) { cout << ii << this->i << endl;} //这样也是不行的,静态成员函数里没有this.
//this是一个hidden,调用这个函数的那个对象.
private:
int k;
static int i;
};
int A::i = 20;
int main()
{
A a,b;
a.set(10);
b.print();
a.say(0);
A::say(0);
cout << A::i << endl;
return 0;
}