IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C/C++ extern和static的使用 -> 正文阅读

[C++知识库]C/C++ extern和static的使用

前言

在讲到extern和static的时候先了解一下定义和声明的基本概念

定义(define):

A variable is defined when the compiler allocates the storage for the variable,就是我们的变量个其存储的具体值相关联

声明(declared)

编译器声明这个变量的存在,宣告其类型但是并不关联某个存储的具体值

你可以声明一个变量多次,但是你只能定义其一次并且给一个范围,我们定义一个变量也是声明,但不是所有的声明都是定义

extern

我们在全局声明/定义一个变量最好的一个方法是在头文件中用关键字extern声明一个变量
在我们工程中,一般用一个头文件声明全部所需的全局变量(当然用extern),然后在所有其他的.c文件中include这个头文件,假设我们有三个文件分别是file3.h,file1.c,file2.c
内容分别如下
var.h

extern int global_var;

var.c

#include "var.h"
#include "prog1.h" //function declarations,我们示例中没有将函数原型头文件写出来

int global_var = 33;

int increment(void) { return global_variable++ }

main.c

#include "var.h"
#include "prog1.h"
#include <stdio.h>
//注意我们没有include file1.c

void use_it(void){
	printf("global var : %d\n",global_var++);
}

然后我们编译 (记住不编译头文件)

gcc main.c var.c -o out.c

为什么我们的main不include var.c就知道global_var的具体值呢?因为我们说过一个全局变量只能定义一次,但是可以声明多次,global_var分别在main,c和var.c中声明了,但是只在var.c中定义,换个角度,global_var的生命周期是全局也就是整个软件的生命周期,整个软件的生命周期包含三个文件,且global_var不定义在堆栈中,而是声明在bss中,定义在initialed data区域中

static

static也是全局但是其作用域不是全局而是本文件中,所以其他的文件include一个含有static的头文件,且试图定义他会报错,因为static变量的作用域只在声明他的头文件中

还是上述的程序但是我们把extern改为static了
var.h

static int global_var;

var.c

#include "var.h"
#include "prog1.h" //function declarations,我们示例中没有将函数原型头文件写出来

int global_var = 33;

int increment(void) { return global_variable++ }

main.c

#include "var.h"
#include "prog1.h"
#include <stdio.h>
//注意我们没有include file1.c

void use_it(void){
	printf("global var : %d\n",global_var++);
}

开始编译发现错误

c++ static members in class

简而言之就是我们的class里面搞一个static的成员,我们知道static的作用域虽然是全局只存在于本文件,那么将一个static放在一个class中间是什么意思呢?
在Cpp的类中使用static就不再和C一样局限于定义的文件中了,在Cpp的class中用static修饰成员有以下的特点

  • 当这个class建立的时候,此class内的static成员在只有一份,无论创建多少个class对象,且每个对象都是共享这个static成员的,换句话说无论多少个对象创建,class的static成员都是第一无二的,且内存中只有一份
  • static成员的初始化发生在此class所有对象创建前
  • 他的声明周期是全程序

我们写一个程序,写一个class,在其public中搞一个static member,且在class的构造函数中对这个static member + 1,意味着此static成员作用是统计有多少个class对象成员

static_mamber.h

using namespace std;

class Box{
public:
        static int objcount;

        Box(double l,double b, double h);

        double volume();

private:
        double length;
        double breadth;
        double height;

};

static_member.cpp

#include "static_member.h"
#include <iostream>

using namespace std;


int Box::objcount = 0; //static成员的初始化在创建所有的class对象之前
//构造函数
Box::Box(double l, double b, double h)
        :length(l),breadth(b),height(h){
                cout << "construct is called," << endl;
                objcount++;
        }

double
Box::volume(){
        return length * breadth * height;
}

main.cpp

#include "static_member.h"
#include <iostream>

using namespace std;


int main(void){
        Box Box1(3.3,1.2,1.5);
        Box Box2(8.5,6.0,2.0);

        cout << "total Box object is "<< Box::objcount << endl;

        return 0;
}

编译

g++ static_member.cpp main.cpp  -o static_member.o

得到结果

construct is called,
construct is called,
total Box object is 2

注意class是全局的也就是extern的因为在所有block({})外部的变量或者class或者函数如果不加static都默认是extern

总结

在C语言中extern修饰后的变量或者函数,可以在其他的文件中进行使用(需要include定义extern变量或者函数的头文件),但是static则不行,static和extern的作用域都是全局但是,static只允许本文件内对其修饰的变量更改,而extern允许在任何文件中更改

在C++中static修饰的是某个class的一个成员,和C中的static完全不一样,首先C++中如果在头文件中声明某个class的某个成员是static,那么我们在其他文件中可以定义他(前提include对于的头文件),这是在C中是不行的,且C++ static member in clss意思是为此class创建一个独一无二的成员,不论你的class实例化多少次,static成员就一个,其他的class对象都是其copy,并且我们可以随时随地修改这个static成员

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-06-26 16:45:42  更:2022-06-26 16:46:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:47:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码