【C++】 静态成员函数

简介: C++ 静态成员函数相关需要注意的事项

【C++】 静态成员函数

一 、静态成员函数概述


类中的成员函数,若未使用类中的成员变量,则可声明为静态成员函数,函数声明前加上 static 关键字。

静态成员函数不属于对象,属于类。静态成员函数不包含编译器提供的 this 指针,在类没有实例化对象前就存在,由于没有 this 指针,所以也就没有特定的成员变量可以使用。

静态成员函数与成员函数用法上的主要不同为:
静态成员函数可以独立访问,调用静态成员函数时,不需要实例化任何对象。只需要使用 类名 + 命名空间标识符 (::) 加函数名即可调用。

ClassName::StaticMemberFunction();

普通成员函数则需要通过对象调用,首先需要实例化一个对象。

ClassName obj;
obj.MemberFunction();

二、静态函数不可以声明为虚函数


如果静态成员函数加上 virtual 关键字,则会编译报错。再者 virtual 的使用,依赖对象内部的 vptr 虚表指针,但静态函数不属于某个具体对象,无法访问其虚表指针。

class StaticMemberFuncTest
{
   
public:
    static virtual void test() {
   };
};

编译报错为:virtual 关键字不可以与 static 一起使用。

 error C2216: 'virtual' cannot be used with 'static'

三、静态成员函数不包含 this 指针


如概述所说,静态成员函数不属于某个具体的对象,而属于类,所以不包含 this 指针。从定义上来讲静态成员函数不使用类中的非静态成员变量,非静态成员变量只有在函数实例化时才会分配内存,this 指针的地址为实例化对象的起始地址。

成员函数既可以调用静态成员变量,也可以调用非静态成员变量;而静态成员函数仅可调用静态成员变量。

示例代码

class StaticMemberFuncTest
{
   
public:
    static StaticMemberFuncTest * test() {
   
        return this;
    };
};

编译报错为:

error C2355: 'this': can only be referenced inside non-static member functions or non-static data member initializers

this 关键字只能在非静态成员函数或非静态数据成员初始化中引用。

四、静态成员函数不可以声明为 const


未修改成员变量的函数可以声明为常函数,加上 const 关键字,但静态成员函数不可以。

class StaticMemberFuncTest
{
   
public:
    static void Test() const {
   
        //;
    };
};
error C2272: 'Test': modifiers not allowed on static member functions

静态成员函数上不允许使用访问限定词,如 const , volatile 等。

五、static 关键字不构成重载


如果一个静态成员函数与一个成员函数的函数名相同,且参数类型列表相同,此两者不会构成重载。

代码示例

class StaticMemberFuncTest
{
   
public:
    static void Test() {
   }
    void Test() {
   }
};

编译报错

error C2686: cannot overload static and non-static member functions with the same parameter types
note: could be 'void StaticMemberFuncTest::Test(void)'
note: or       'void StaticMemberFuncTest::Test(void)'

不能用相同的参数类型重载静态和非静态成员函数。

六、静态成员函数的地址与绑定


对于类

class StaticMemberFuncTest
{
   
public:
    static int StaticFunc() {
   /**/};
    int MemberFunc() {
   /**/};
};
  1. 静态成员函数在存储函数地址时可以用普通的函数指针
// 静态成员函数指针
int (*funcptr1)() = &StaticMemberFuncTest::StaticFunc;
// 成员函数指针
int (StaticMemberFuncTest::*funcptr2)() = &StaticMemberFuncTest::MemberFunc;
  1. 在使用 STL 的 bind 时,不需要传入类成员函数的指针
// 绑定静态成员函数
std::bind(&StaticMemberFuncTest::StaticFunc);
// 绑定成员函数
std::bind(&StaticMemberFuncTest::MemberFunc, this);

参考链接:

目录
相关文章
|
28天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
1月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
45 6
|
1月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
23 0
C++ 多线程之线程管理函数
|
1月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
23 3
|
1月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
158 1
|
1月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
30 1
|
1月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
41 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
2月前
|
编译器 C++
【C++核心】函数的应用和提高详解
这篇文章详细讲解了C++函数的定义、调用、值传递、常见样式、声明、分文件编写以及函数提高的内容,包括函数默认参数、占位参数、重载等高级用法。
22 3
|
3月前
|
编译器 C++ 容器
【C++】String常见函数用法
【C++】String常见函数用法
|
3月前
|
C++
c++常见函数及技巧
C++编程中的一些常见函数和技巧,包括生成随机数的方法、制表技巧、获取数字的个位、十位、百位数的方法、字符串命名技巧、避免代码修改错误的技巧、暂停和等待用户信号的技巧、清屏命令、以及避免编译错误和逻辑错误的建议。
34 6