静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员
静态成员分为:
所有对象共享同一份数据 在编译阶段分配内存 类内声明,类外初始化
示例:
#include<iostream>using namespace std;class person{public: static int m; // 所有对象共享同一份数据};int person小说定义::m = 0;// 类内声明,类外初始化
所有对象共享一个函数静态成员函数只能访问静态成员变量
#include<iostream>using namespace std;class per跟秋天有关的词语son{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("pau"); 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
结论:只有非静态成员变量才属于类的对象上
每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码
那么问题是:这块代码是如何区分是哪个对象调用自己的呢?
c++通过提供的特殊的对象指针,this指针,解决上述问题,this 指针指向被调用的成员函数所属的对象,通俗的说,谁调用它,this就指向谁
this 指针是所有成员函数的隐含参数吗,不需要定义,可直接使用
this 指针的用途
1.当形参和成员变量同名时,可用this指针来区分2.在类的非静态成员函数中返回对象本身,可用 return *this
1.当形参和成员变量同名时,可用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);co描写雨的诗句ut << p.age << endl;system("pau");return 0;}
2.在类的非静态成员函数中返回对象本身,可用 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("pau");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("paus表示心情的句子e");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("pau");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("pau");return 0;}
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注www.887551.com的更多内容!
本文发布于:2023-04-04 08:37:56,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/9869c03f6a7dff62b93221a3c80874e3.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:C++静态成员函数和this指针详解.doc
本文 PDF 下载地址:C++静态成员函数和this指针详解.pdf
留言与评论(共有 0 条评论) |