静态成员函数和this指针

简介: 静态成员函数和this指针

静态成员

静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员
静态成员分为:

1.静态成员变量

 所有对象共享同一份数据
 在编译阶段分配内存
 类内声明,类外初始化

示例:

#include
using namespace std;
class Person
{
    
public:
   static int m; // 所有对象共享同一份数据
};
int Person::m = 0;// 类内声明,类外初始化

2.静态成员函数

所有对象共享一个函数
静态成员函数只能访问静态成员变量
#include
using namespace std;
class Person
{
    
public:
   static void func()
   {
    
       cout << "static void func调用" << endl;
       m_a = 100;//静态成员函数可以访问静态成员变量
       //m_b=100,静态成员函数不可以访问非静态成员变量
       //原因无法区分到底哪个是对象的m_b;
   }
   static int m_a;//静态成员变量
   int m_b;
};
int Person::m_a = 0;
int main()
{
    
   //1.通过对象访问
   Person p;
   p.func();
   //2.通过类名访问
   Person::func();

   system("pause");
   return 0;
}

静态成员函数可以访问静态成员变量
静态成员函数不可以访问非静态成员变量
私有权限的静态成员函数,也是访问不到的

成员变量和成员函数分开存储

在C++中,类内的成员变量和成员函数分开存储
只有非静态成员变量才属于类的对象上

空对象:

#include
using namespace std;
class Person
{
    

};
void test01()
{
    
    Person p;
    //空对象占用内存空间为:1
    //C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置
    //每个空对象也应该有独一无二的内存地址
    cout << sizeof(p) << endl;
}
int main()
{
    
    test01();
    return 0;
}

输出结果:1

#include
using namespace std;
class Person
{
    
    int m_a;//非静态成员变量 属于类的对象上
};
void test02()
{
    
    Person p;
    cout << sizeof(p) << endl;
}
int main()
{
    
    test02();
}

输出结果:4

#include
using namespace std;
class Person
{
    
    int m_a;//非静态成员变量 属于类的对象上
    static int m_b; //静态成员变量 不属于类的对象上
};
void test02()
{
    
    Person p;
    cout << sizeof(p) << endl;
}
int main()
{
    
    test02();
}

输出结果:4
与第二个对比可知:
静态成员变量 不属于类的对象上

#include
using namespace std;
class Person
{
    
    int m_a;//非静态成员变量 属于类的对象上
    static int m_b; //静态成员变量 不属于类的对象上
    void func() {
    }//非静态成员函数 不属于类的对象上
    static void func2() {
    } //静态成员函数也不会属于 类的对象上
};
 int Person::m_b = 0;
void test02()
{
    
    Person p;
    cout << sizeof(p) << endl;
}
int main()
{
    
    test02();
}

输出结果:4

结论:只有非静态成员变量才属于类的对象上

this 指针

每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码
那么问题是:这块代码是如何区分是哪个对象调用自己的呢?

C++通过提供的特殊的对象指针,this指针,解决上述问题,this 指针指向被调用的成员函数所属的对象,
通俗的说,谁调用它,this就指向谁
this 指针是所有成员函数的隐含参数吗,不需要定义,可直接使用

this 指针的用途

1.当形参和成员变量同名时,可用this指针来区分
2.在类的非静态成员函数中返回对象本身,可用 return  *this 

1.当形参和成员变量同名时,可用this指针来区分

#include
using namespace std;
class Person
{
    
public:
    void func(int age)
    {
    
        this->age = age;  //
    }
    int age;
};
int main()
{
    
    Person p;
    p.func(18);
    cout << p.age << endl;
    system("pause");
    return 0;
}

2.在类的非静态成员函数中返回对象本身,可用 return *this

#include
using namespace std;
class Person
{
    
public:
    Person& func(Person&p)
    {
    
        this->age += p.age;
        return *this;
    }
    int age;
};
int main()
{
    
    Person p;
    p.age = 10;
    //链式编程思想
    p.func(p).func(p).func(p);
    cout << p.age << endl;
    system("pause");
    return 0;
}

空指针访问成员函数

C++中空指针是可以调用成员函数,但是也要注意有没有用到this指针
如果用到this指针,需要加以判断保证代码的健壮性

#include
using namespace std;
class Person
{
    
public:
    void ShowPersonclass()
    {
    
        cout << "调用ShowPerclass()函数" << endl;
    }
};
int main()
{
    
    Person* p = NULL;
    p->ShowPersonclass();
    system("pause");
    return 0;
}

通过空指针p是可以访问到成员函数(不带this指针的成员函数)
如下代码就是一个错误代码

#include
using namespace std;
class Person
{
    
public:
    void ShowPersonname()
    {
    
        cout << m_name << endl;  //此处出现了this指针
    }
    int m_name;
};
int main()
{
    
    Person* p = NULL;
    p->ShowPersonname();
    system("pause");
    return 0;
}

解析:
此处出现了this指针,

cout << m_name << endl;

相当于

cout <<this -> m_name << endl;

而this指针是一个空指针,所以会报错
为了增加代码的健壮性,我们因该做出如下改动

#include
using namespace std;
class Person
{
    
public:
    void ShowPersonname()
    {
    
        if (this == NULL)  //在此判断this是否是空指针
            return;
        cout << m_name << endl;
    }
    int m_name;
};
int main()
{
    
    Person* p = NULL;
    p->ShowPersonname();
    system("pause");
    return 0;
}
相关文章
|
29天前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
51 4
|
2月前
|
存储 C语言 C++
如何通过指针作为函数参数来实现函数的返回多个值
在C语言中,可以通过将指针作为函数参数来实现函数返回多个值。调用函数时,传递变量的地址,函数内部通过修改指针所指向的内存来改变原变量的值,从而实现多值返回。
|
2月前
|
存储 搜索推荐 C语言
如何理解指针作为函数参数的输入和输出特性
指针作为函数参数时,可以实现输入和输出的双重功能。通过指针传递变量的地址,函数可以修改外部变量的值,实现输出;同时,指针本身也可以作为输入,传递初始值或状态。这种方式提高了函数的灵活性和效率。
|
2月前
利用指针函数
【10月更文挑战第2天】利用指针函数。
20 1
|
2月前
|
算法 搜索推荐 C语言
【C语言篇】深入理解指针4(模拟实现qsort函数)
【C语言篇】深入理解指针4(模拟实现qsort函数)
26 2
|
3月前
|
Linux
在Linux内核中根据函数指针输出函数名称
在Linux内核中根据函数指针输出函数名称
|
4月前
|
程序员 C语言
指针在函数参数和返回值中的使用
指针在函数参数和返回值中的使用
69 9
|
4月前
|
存储 搜索推荐 C语言
C语言中的指针函数:深入探索与应用
C语言中的指针函数:深入探索与应用
|
6月前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
53 0
|
6月前
|
C语言
C语言中的函数指针、指针函数与函数回调
C语言中的函数指针、指针函数与函数回调