Static in C++
Two basic meanings
Static Storage
--allocated once at a fixed address
Visibility of a name
--internal linkage
Don't use static except inside functions and classes.
Uses of "static" in C++
Static free functions----deprecated弃用
Static globle variables----deprecated弃用
Static local variables----Persistent storage持久存储
Static member variables----Shared by all instances所有对象共享
Static member functions----Shared by all instances, can only access static member variables所有对象共享,只能访问静态变量或静态函数
Static inside functions
Value is remembered for entire program
Initialization occurs only once
Static applied to objects...
Construction occurs when definition is encountered
--Constructor called at-most once
--The constructor arguments must be satisfied
Destruction takes place on exit form program
--Compiler assures LIFO order of destructors
Can we apply static to members?
Static means
--Hidden
--Persistant
Hidden: A static member is a member
--Obeys usual access rules
Persistant: Independent of instances
error LNK2001: 无法解析的外部符号 "private: static int A::i" (?i@A@@0HA)
可以编译,链接失败
写在类里面的都是声明,不是定义
1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 A() { i = 0; } 8 void print() { std::cout << i << std::endl; } 9 void set(int ii) { i = ii; } 10 private: 11 static int i; 12 }; 13 14 void main() 15 { 16 A a, b; 17 18 //error LNK2001: 无法解析的外部符号 "private: static int A::i" (?i@A@@0HA) 19 20 a.set(10); 21 b.print(); 22 23 system("pause"); 24 }
error C2438: “i”: 无法通过构造函数初始化静态类数据
初始化列表,无法初始化静态类数据
1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 A() :i(10) { }//error C2438: “i”: 无法通过构造函数初始化静态类数据 8 void print() { std::cout << i << std::endl; } 9 void set(int ii) { i = ii; } 10 private: 11 static int i; 12 }; 13 14 int A::i; 15 16 void main() 17 { 18 A a, b; 19 20 a.set(10); 21 b.print(); 22 23 system("pause"); 24 }
静态数据成员有this指针,静态成员函数没有this指针
1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 A() { } 8 void print() { std::cout << i << std::endl; } 9 void set(int i) { this->i = i; }//静态数据成员有this指针,静态成员函数没有this指针 10 private: 11 static int i; 12 }; 13 14 int A::i = 20; 15 16 void main() 17 { 18 A a, b; 19 20 a.set(10); 21 b.print(); 22 23 system("pause"); 24 }
static静态数据成员实际上是全局变量
通过对象都可以访问i
通过类都可以访问i
1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 A() { } 8 void print() { std::cout << i << std::endl; } 9 void set(int i) { this->i = i; } 10 static int i; 11 }; 12 13 int A::i = 20; 14 15 void main() 16 { 17 A a, b; 18 19 a.set(10); 20 b.print(); 21 22 std::cout << a.i << std::endl;//通过对象都可以访问i 23 std::cout << A::i << std::endl;//通过类都可以访问i 24 25 system("pause"); 26 }
error C2248: “A::i”: 无法访问 private 成员(在“A”类中声明)
1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 A() { } 8 void print() { std::cout << i << std::endl; } 9 void set(int i) { this->i = i; } 10 private: 11 static int i; 12 }; 13 14 int A::i = 20; 15 16 void main() 17 { 18 A a, b; 19 20 a.set(10); 21 b.print(); 22 23 std::cout << a.i << std::endl;//error C2248: “A::i”: 无法访问 private 成员(在“A”类中声明) 24 std::cout << A::i << std::endl;//error C2248: “A::i”: 无法访问 private 成员(在“A”类中声明) 25 26 system("pause"); 27 }
error C2597: 对非静态成员“A::k”的非法引用
1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 A() { } 8 void print() { std::cout << i << std::endl; } 9 void set(int i) { this->i = i; } 10 static void say(int ii) { std::cout << ii << " " << k << endl; }//error C2597: 对非静态成员“A::k”的非法引用 11 private: 12 int k; 13 static int i; 14 }; 15 16 int A::i = 20; 17 18 void main() 19 { 20 A a, b; 21 22 a.set(10); 23 b.print(); 24 25 a.say(0); 26 A::say(0); 27 28 system("pause"); 29 }
虽然还没有建立类的对象,但可以访问静态成员。为了实现,因此没有this指针。
静态成员函数没有this指针
error C2355: “this”: 只能在非静态成员函数或非静态数据成员初始值设定项的内部引用
error C2227: “->i”的左边必须指向类/结构/联合/泛型类型
1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 A() { } 8 void print() { std::cout << i << std::endl; } 9 void set(int i) { this->i = i; } 10 static void say(int ii) { std::cout << ii << " " << this->i << endl; }//静态成员函数没有this指针 11 12 //1>main.cpp(10) : error C2355 : “this” : 只能在非静态成员函数或非静态数据成员初始值设定项的内部引用 13 // 1>main.cpp(10) : error C2227 : “->i”的左边必须指向类 / 结构 / 联合 / 泛型类型 14 15 private: 16 int k; 17 static int i; 18 }; 19 20 int A::i = 20; 21 22 void main() 23 { 24 A a, b; 25 26 a.set(10); 27 b.print(); 28 29 a.say(0); 30 A::say(0); 31 32 system("pause"); 33 }