静态成员变量
1.它存储在静态区,静态成员变量不占用对象的空间
##
不能调用构造函数初始化,因为构造函数归类所有,不是对象所有
2.必须在类内定义,类外初始化
你调用对象的构造函数无法对类的静态成员变量进行初始化
3.静态成员变量属于类不属于对象,多个对象共享一个共有的静态成员变量
4.可以通过对象名或者类名直接访问静态成员变量
//对象名.静态成员变量 //类名::静态成员变量
5.静态成员变量在编译阶段分配内存,也就是主函数之前
6.在主函数之前执行的有什么?
静态成员变量的初始化和全局变量的初始化
#include<iostream> using namespace std; class B { public: B() { cout << "B的构造函数" << endl; } }; class A { int a; public: static B m;//静态的类成员 static int n; static void Show() { cout << "hello" << endl; } }; int A::n = 0;//类外初始化 B A::m=B(); /* * 1.静态成员变量属于类,不属于对象,多个对象共享一个静态成员变量 * 2.静态成员变量在类内定义,类外初始化 * 3.可以通过对象名或类名直接访问公有的静态成员变量 * 4.静态成员变量在编译阶段分配内存,也就是主函数之间 * 5.主函数之前会执行什么? * 静态成员变量的初始化和全局变量的初始化 */ int main() { cout << "__________________________" << endl; A a1,a2,a3; a1.n++; a2.n++; a3.n++; A::n++; cout << A::n << endl; cout << a1.n << endl; cout << a2.n << endl; cout << a3.n << endl; return 0; }
静态成员函数
1.成员函数存储在代码段内,不占用对象空间
2.静态成员函数属于类,不属于对象
3.可以通过类名和对象名去调用公有的静态成员函数
4.静态成员函数没有this指针,只能访问静态成员
因为没有this指针的话,编译器就无法确定究竟是对哪个对象的非静态成员变量进行操作
4.成员函数不占用对象的空间,成员函数是统一放在代码段当中的,当对象想访问它的成员函数的时候,会到代码段中去寻找那段代码。成员函数通过this指针去区分究竟对哪个对象里面的数据进行操作
#include <iostream> using namespace std; class A { int b; static int a; public: static void func1() { } static void func() { this->b = 1; func1(); a = 2; } }; int A::a = 0; int main() { return 0; }
在C++中空指针是可以访问成员函数的
#include <iostream> using namespace std; class A { int a = 2; public: void func1() { a = 1; cout << "1" << endl; } static void func2() { cout << "2" << endl; } }; int main() { A* a = nullptr; return 0; a->func1(); a->func2(); A::func2(); }
但是要注意有没有用到this指针,因为空指针调用成员函数的时候this指针也为空,对象里面是没有内容的。
为了保持程序的健壮性,可以对成员函数进行判空操作
if(this==NULL) return ;