天天看点

第十三讲 静态成员变量/函数+静态全局/局部变量—————面向对象高级开发

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;
}