static功能介绍

static作用主要有以下四点:

1、修饰普通变量,变量存储在静态区,只会被初始化一次,默认值为0;

2、修饰普通函数,表明函数的作用范围,仅在定义该函数的文件内才能使用。在多人开发项目时,为了防止与他人命名空间里的函数重名,可以将函数定为 static。

3、修饰成员变量,该类只保存一个该变量,可以通过类直接访问,在类中声明,在类外初始化。

4、修饰成员函数,无需生成对象可以直接访问,static函数内不能访问非静态成员。

备注:类在实例化的时候,是通过new关键字来进行的,new时会默认提供一个隐藏的this指针,该指针的作用是用来访问实例对象的成员变量的。

 

第一点:

demo:

#include <iostream>
using namespace std;
void fun()
{
    static int a = 10;
    a++;
    cout<<a<<endl;
}
int main()
{
    for(int i = 0; i < 5; i++)
    {
        fun();
    }
    return 0;
}

结果:

11

12

13

14

15

可以看到,a定义完之后,a是存储在静态区,不会随着fun函数的退出而消亡,它的值也会随着操作的改变而改变。

第二点:

demo:

static_test.h
#include <iostream>
void fun1();
static void fun2();
//void fun2();
static_test.cpp
#include <iostream>
#include "static_test.h"
using namespace std;
void fun1()
{
    cout<<"fun1()"<<endl;
}
static void fun2()
{
    cout<<"fun2()"<<endl;
}
/*
void fun2()
{
    cout<<"fun2()"<<endl;
}
*/
static_test_2.cpp
#include <iostream>
#include "static_test.h"

int main()
{
    fun1();
    fun2();
    return 0;
}

这个时候g++ -o static_test static_test_2.cpp static_test.cpp编译是会报错的,找不到

static_test_2.cpp:(.text+0xa): undefined reference to `fun2()' fun2()函数,因为fun2为静态函数,只能被定义的源文件访问,这样就避免了函数重名的情况。

第三种:

demo:

#include <iostream>
using namespace std;
class Static_test
{
public:
    static int a;
    int b;
    void fun()
    {
        cout<<a<<endl;
    }
};
int Static_test::a = 10;
int main()
{
    Static_test A;
    A.fun();
    cout<<Static_test::a<<endl;
    //Static_test::fun();
    return 0;
}

结果:

10

10

静态成员变量不要在头文件中初始化,这样做会重复定义。在类中声明,在类外初始化。可以通过类名直接访问,所有的类对象共用同一个该静态成员变量。

第四种:

#include <iostream>
using namespace std;
class Static_test
{
public:
    static int a;
    int b;
    static void fun()
    {
        cout<<a<<endl;
        //cout<<b<<endl;
    }
};
int Static_test::a = 10;
int main()
{
    Static_test::fun();
    return 0;
}

结果:

10

静态成员函数可直接被类访问,静态成员函数只能访问静态成员变量。

<think>我们正在处理用户关于"vc_static"的查询。根据引用内容,用户可能是在询问C++中的静态成员(static)在MFC(Microsoft FoundationClasses)或VisualC++环境中的应用,特别是结合了引用[3]中提到的CStatic控件(MFC中的一个类)的相关信息。分析引用内容:引用[1]和[2]主要讨论C++类中static成员(变量和函数)的一般用法,包括定义、访问、初始化、限制等。引用[3]则涉及MFC中的CStatic控件,具体是如何更新静态控件的内容而不出现文字重叠的问题。用户询问的是"vc_static",这个术语并不常见。我们推测可能是用户将"VC"(VisualC++)和"static"(静态)组合在一起,可能指以下两种情况之一:1.在VisualC++编程中,类静态成员(static)的使用(如引用[1]和[2]所述)。2.在MFC中,CStatic类的使用(如引用[3]所述)。由于引用[3]提到了CStatic控件,并且用户的问题中也有"vc_static",我们倾向于认为用户可能是在询问MFC中的CStatic控件。因此,我们将重点介绍MFC中的CStatic类,同时也简要提及VisualC++中static关键字在类中的使用(因为引用[1]和[2]也提供了相关信息)。回答结构:1.介绍vc_static(我们将其解释为MFC中的CStatic类)的基本概念。2.功能:CStatic类的主要功能。3.使用场景:CStatic类的典型使用场景。4.补充:如果用户也可能指类静态成员,则简要说明static在类中的使用(因为引用[1][2]提到)。注意:如果用户确实指的是类静态成员,那么引用[1]和[2]已经提供了详细说明,我们可以在此基础上补充。由于引用[3]提到了CStatic控件更新内容的问题,我们也可以提及这一点。因此,我们生成如下回答:</think>### vc_static 介绍功能与使用场景 `vc_static` 并非标准术语,结合上下文推测可能指以下两种场景: #### 1. **MFC 中的 `CStatic` 控件** **介绍**: `CStatic` 是 Microsoft Foundation Classes (MFC) 中的控件类,用于创建静态文本、图标或矩形框等非交互式界面元素。 **功能**: - **显示文本/图像**:在窗口上显示标签、图标或位图。 - **视觉分隔**:作为分组框或分隔线(如 `SS_ETCHEDFRAME` 样式)。 - **动态更新**:通过 `SetWindowText()` 更新文本(需配合 `InvalidateRect()` 避免文字重叠[^3])。 **使用场景**: - **对话框标签**:在对话框中显示说明性文字(如 "用户名:")。 - **状态指示器**:实时显示程序状态(如 "连接中...")。 - **图像容器**:展示图标或位图资源。 **示例代码(MFC)**: ```cpp // 创建静态文本控件 CStatic* pStatic = new CStatic(); pStatic->Create(_T("状态栏"), WS_CHILD | WS_VISIBLE, CRect(10,10,100,30), this); // 动态更新文本(避免重叠) pStatic->InvalidateRect(nullptr); // 强制刷新区域 pStatic->SetWindowText(_T("加载完成")); ``` --- #### 2. **C++ 类中的 `static` 成员**(与 Visual C++ 相关) **介绍**: 在 C++ 类中,`static` 成员属于类本身而非实例,所有对象共享同一份数据/函数[^1][^2]。 **功能**: - **共享数据**:静态变量在类的所有实例间共享(如计数器)。 - **工具函数**:静态函数无需实例即可调用(如工具类方法)。 - **单例模式**:通过静态成员实现全局唯一实例[^1]。 **使用场景**: - **资源管理**:共享资源池(如数据库连接池)。 - **工具类**:提供数学计算等无状态函数(如 `MathUtils::sqrt()`)。 - **单例设计**:确保类只有一个实例(如日志管理器)[^1]。 **示例代码**: ```cpp class Logger { public: static Logger& getInstance() { static Logger instance; // 唯一实例 return instance; } void log(const std::string& msg) { /* ... */ } private: Logger() {} // 私有构造函数 }; // 调用单例 Logger::getInstance().log("系统启动"); ``` --- ### 注意事项 - **`CStatic` 控件**:动态更新时需调用 `InvalidateRect()` 防止文字重叠[^3]。 - **`static` 成员**: - 静态函数不能访问非静态成员(无 `this` 指针)[^2]。 - 静态变量需在类外初始化(如 `int MyClass::count = 0;`)[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值