C++学习日记 Day6:静态成员+this指针+空指针+常函数/常对象
## 今天学了什么今天学习C的静态成员函数/变量、C对象模型和this指针、空指针访问成员函数以及常函数、常对象。## 静态成员定义在成员变量和成员函数前加上关键字static。分类静态成员分为静态成员变量和静态成员函数。### 静态成员变量所有对象共享同一个数据在编译阶段分配内存类内声明类外初始化。#include iostream using namespace std; class Person { public: void func() { cout m_age endl; } static int m_age; }; int Person::m_age 100; //类外初始化 void test() { Person p; p.func(); } int main() { test(); return 0; }Ⅰ. 访问静态成员变量的方式有两种①通过对象进行访问Person p;p.m_a;②通过类名访问Person::m_aⅡ.有访问权限在private下的变量类外无法访问。### 静态成员函数不属于某个对象属于类所有对象共享同一个函数静态成员函数只能访问静态成员变量原因静态成员函数不属于任何对象没有this指针所以无法访问非静态成员。Ⅰ. 访问方式有两种①通过对象进行访问Person p;p.func();②通过类名访问Person::func();Ⅱ.有访问权限在private下的函数类外无法访问。## this指针类内的成员变量和成员函数分开储存只有非静态成员变量储存在类的对象上。*注空对象占用内存空间为1字节sizeof原因编译器会给每个空对象分配一个字节空间是为了区分空对象占用内存的位置每个空对象有一个独一无二的内存地址。this指针多个同类型对象会共用一块实例代码代码无法区分哪个对象调用自己this指针指向被调用的成员函数所属的对象用于解决以上问题。用途当形参和成员变量同名时可以用this指针区分在类的非静态成员函数中返回对象本身Person classfun(int b){this-b b;return *this;}可用于链式编程b.classfun(6).classfun(1).classfun(5); //输出结果12发现关于链式编程返回值必须加引用如果不加b的值不会叠加。原因返回*this 时不加 则返回拷贝了一个临时变量所以除了第一次b的值被修改以外后面的调用无效。## 空指针访问成员函数测试定义一个空指针分别访问带有/不带成员变量的函数#include iostream using namespace std; class Person { public: void showPersonaAge() { cout m_age endl; } void showClassName() { cout This is Person class. endl; } int m_age; }; void test() { Person *pNULL; p-showClassName(); p-showPersonaAge(); } int main() { test(); return 0; }运行报错在访问成员变量那下一个断点进调试发现this指针的地址一直为0导致运行出错。结论C中空指针可以调用成员函数成员函数放在代码段如果不访问成员变量代码能跑。在日常写代码中可用 ifthisnullptr) 增加代码建设性但更推荐在调用方保证指针非空。## 常函数/常对象### 常函数成员函数后加const。常函数内不可以修改成员属性;如果存在特殊情况需要修改成员属性则需在成员属性声明时在成员属性前加关键字 mutable。#include iostream using namespace std; class Person { public: void func() { m_age 10; cout 普通成员函数 m_age endl; } void fun () const { //m_age 10; //this-m_age 无法修改 cout 常函数 m_age endl; } int m_age0; }; void test() { Person p; p.func(); p.fun(); } int main() { test(); return 0; }在访问常函数处下一个断点进入调试发现this指针的类型为 const Person*这就是常函数无法修改成员属性的原因。### 常对象声明对象前加const。const Person p;** 常对象只能调用常函数 **原因常对象不能调用普通函数因为普通函数可以修改成员属性与const不能修改值产生冲突。