C++_static变量/函数, extern变量/函数

static变量, 错误使用

class ST{
   
public:
    void func(){
   
        static Foo t;
    }
};

int main(){
   
	ST t0; t0.func();
    ST t1; t1.func();
    ST t2; t2.func();
}

这种写法, 其实只有Foo对象!!! (即, 不同的类对象 的static变量, 是同一个)

本质来讲, (类的成员函数), 其实和 (普通全局函数) 是一样的!!! 即, 所有类的对象, 他都共享同一个 (成员函数地址)

所以, 你把 以上代码中, (成员函数func) 看做是 (全局函数), 就理所当然了


for( int i = 0; i < 10; ++i){
   
	static ST obj( i);
}

这种写法, 其实只有一个ST obj( 0)的对象!!!


void func( int _id){
   
	static ST obj( _id);
}

func( 0);
func( 1);
func( 2);

这种写法, 其实只有一个ST obj( 0)的对象!!!


void func(){
   
	static ST obj0( 0);
	static ST obj2( 0);
	static ST obj3( 0);
}

这种写法, 是有 3个 ST( 0)对象


void func(){
   
	{
   
		static ST obj( 0);
	}
	{
   
		static ST obj( 0);
	}
	{
   
		static ST obj( 0);
	}
}

这种写法, 是有 3个 ST( 0)对象


所以, static对象的使用, 和 普通对象, 真的是, 非常非常的不同!!! 要怎么区分呢?

你写了几个static关键字, 就意味着: 有几个对象

比如有一个需求: (对于func( _id)函数, 每次调用, 相同的_id 都是同一个static对象; 否则, 是不同的对象)

void func( int _id){
   
	if( _id == 0){
    static ST obj( _id);}
	if( _id == 1){
    static ST obj( _id);}
	if( _id == 2){
    static ST obj( _id);}
	if( _id == 3){
    static ST obj( _id);}
	if( _id == 4){
    static ST obj( _id);}
	.... 
	' 等等...  你都得手动一个个写 '
}

总之要牢记, 你 (显式)的 写了几个static, 就有几个对象

static/extern函数

全局函数

a.h:   
	static void F();
	
a.cpp: 
	static void F(){
    aaa}

此时, 在a.cpp里的 其他函数里, 使用F()函数 是可以的

但是, 如果在其他x.cpp文件里, #include "a.h"后, 使用F()函数, 是报错的!!! undefined reference toF()’`

你需要, 在x.cpp里, 也去实现他static vo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,使用extern声明可以在一个文件中调用其他文件中定义的函数,或者说将该函数的作用域扩展到本文件。extern声明的形式是在函数原型基础上加上关键字extern。在程序中经常需要调用其他文件中的外部函数,为了方便编程,C++允许在声明函数时省略extern关键字。例如,在主文件中可以使用extern声明来调用其他文件中定义的函数。\[1\] 举个例子,假设有一个test.cpp文件中定义了一个函数,我们可以在主文件中使用extern声明来调用这个函数。首先,在test.h文件中声明外部函数,然后在test.cpp文件中定义外部函数并进行初始化。最后,在主文件中使用extern关键字来调用外部函数。\[2\] 另外,C++中还有内部函数,也称为静态函数。使用内部函数可以使函数只局限于所在文件,如果在不同的文件中有同名的内部函数,它们互不干扰。通常将只能由同一文件使用的函数和外部变量放在一个文件中,并在它们前面加上static关键字使之局部化,其他文件不能引用这些函数变量。\[3\] #### 引用[.reference_title] - *1* *3* [简单讲解C++的内部和外部函数以及宏的定义](https://blog.csdn.net/weixin_39663258/article/details/117269869)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C++声明extern变量extern函数的用法](https://blog.csdn.net/wenchm/article/details/130765956)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值