文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++静态成员函数和this指针是怎样的

2023-06-22 07:04

关注

本篇文章给大家分享的是有关C++静态成员函数和this指针是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

静态成员

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

静态成员分为:

1.静态成员变量

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

示例:

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

2.静态成员函数

所有对象共享一个函数静态成员函数只能访问静态成员变量
#include<iostream>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<iostream>using namespace std;class Person{};void test01(){Person p;//空对象占用内存空间为:1//C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置//每个空对象也应该有独一无二的内存地址cout << sizeof(p) << endl;}int main(){test01();return 0;}

输出结果:1

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

输出结果:4

#include<iostream>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<iostream>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

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

#include<iostream>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;}

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

#include<iostream>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<iostream>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<iostream>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<iostream>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;}

以上就是C++静态成员函数和this指针是怎样的,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯