1 静态成员变量/函数+静态全局/局部变量
静态的作用:
- 1,延长生命周期(局部变量)
- 2,都默认初始化为0(全局或局部修饰的变量)
- 3,隐藏功能(只对同一个源文件有效【同名的.h、.cpp】,避免命名冲突)
1.1 静态成员变量/函数
- 1,静态成员变量:同一个类中只有一份,多个类共用一个;
- 2,静态成员函数:函数内没有this指针,只能改变静态变量的值(因为静态成员函数属于整个类,在类实例化对象之前就已经分配空间了,而类的非静态成员必须在类实例化对象后才有内存空间),用于配合静态变量使用;静态成员函数中不能调用非静态函数,反之则可以。
#include
#include
class A{
public:
A(){}
static void func(){
m_data = 2;
//m_data2 = 3;//error: invalid use of member 'a' in static member function
}
void print(){
std::cout<<m_data<<std::endl;
}
private:
static int m_data;
int m_data2;
};
int A::m_data = 1;//通过类名调用
int main(){
A a;
a.print();
((A*)0)->func();//静态函数
a.print();
a.func();//通过对象名调用
a.print();
return 0;
}
1. 2 非成员静态全局/局部变量
- 1,静态全局变量:静态全局变量在头文件中可以声明也可以定义,只对同一个源文件(同名的.h、.cpp)有效,避免命名冲突;但是extern变量在头文件中只能声明,然后在源文件(.cpp)中必须有定义(因为extern用于变量,表示它在其他地方定义,在运行前就已经存在)。
- 2,静态局部变量:将函数中此变量的值保存至下一次调用时,只能被初始化一次(用于避免使用全局变量时,破坏了此变量的访问范围)
test.h
#ifndef ALGORITHM_TEST_H
#define ALGORITHM_TEST_H
static double g_grade;//不初始化时,默认为0
extern double g_grade2;
//double g_grade3;//错误:ld: 1 duplicate symbol for architecture x86_64
void func2();
#endif //ALGORITHM_TEST_H
test.cpp
#include "test.h"
#include
double g_grade2 = 100;
void func2(){
//全局静态变量
//打印默认值
std::cout<<"test.cpp--->g_grade全局静态变量赋值前:"<<g_grade<<std::endl;//g_grade:0
//打印复印后的值
g_grade = 92;
std::cout<<"test.cpp--->g_grade全局静态变量赋值后:"<<g_grade<<std::endl;//g_grade:92
std::cout<<"test.cpp--->g_grade2全局变量:"<<g_grade2<<std::endl;//g_grade2:96.8
// std::cout<<"g_grade3:"<
}
main.cpp
#include
#include
#include "test.h"
int func1(){//静态局部变量
static int n = 0;
n++;
return n;
}
int main(){
//局部静态变量
std::cout<<"局部静态变量:";
for(int i = 0;i < 5;++i){
std::cout<<func1()<<" ";
if(i == 4) std::cout<<std::endl;
}
//全局变量+全局静态变量
std::cout<<"全局变量:"<<std::endl;
func2();
std::cout<<"main.cpp--->g_grade全局静态变量赋值前:"<<g_grade<<std::endl;//g_grade:0
std::cout<<"main.cpp--->g_grade2全局变量赋值前:"<<g_grade2<<std::endl;//g_grade2:100
g_grade = 96.8;
g_grade2 = 96.8;
// g_grade3 = 98.7;
std::cout<<"main.cpp--->g_grade全局静态变量赋值后:"<<g_grade<<std::endl;//g_grade:96.8
std::cout<<"main.cpp--->g_grade2全局变量赋值后:"<<g_grade2<<std::endl;//g_grade2:96.8
//std::cout<<"g_grade3:"<
return 0;
}
输出:
局部静态变量:1 2 3 4 5
全局变量:
test.cpp--->g_grade全局静态变量赋值前:0
test.cpp--->g_grade全局静态变量赋值后:92
test.cpp--->g_grade2全局变量:100
main.cpp--->g_grade全局静态变量赋值前:0
main.cpp--->g_grade2全局变量赋值前:100
main.cpp--->g_grade全局静态变量赋值后:96.8
main.cpp--->g_grade2全局变量赋值后:96.8
1.3 静态非成员函数
-
1,作用:声明的函数定义时,只在当前文件附属的.cpp中有效,在其他地方可以重复定义。
test.h
#ifndef ALGORITHM_TEST_H
#define ALGORITHM_TEST_H
void func2();
static void func3();
#endif //ALGORITHM_TEST_H
#include "test.h"
#include
void func2(){
}
void func3() {
std::cout<<"test.cpp--->全局静态函数:func3()";
}
#include
#include
#include "test.h"
//void func2(){//错误:ld: 1 duplicate symbol for architecture x86_64
//
//}
//可以在这里重复定义func3
void func3(){
std::cout<<"main.cpp--->全局静态函数:func3()";
}
int main(){
func3();//要调用此函数,main.cpp中必须定义func3,其他源文件中定义无效
return 0;
}