ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

第21节 类的成员变量与成员函数、基础编码规范

第21节 类的成员变量与成员函数、基础编码规范 承接上文上一节我们学习了class基础语法与public/private访问权限理解面向对象封装思想。本节拆解类内部两大核心组成成员变量、成员函数讲解二者的内存特性同时落地C类开发的工程编码规范养成干净、易维护的代码写法规避新同学常见编码陋习。学习说明类本质就是把**数据成员变量和操作数据的行为成员函数**打包在一起。成员变量描述对象有什么属性成员函数描述对象能做什么行为。 很多新手写类时随意命名、权限乱设埋下大量隐性bug。本节除语法外重点落地工程编码规范为后续构造函数、继承章节打好基础。本节学习目标分清成员变量、成员函数的概念理解成员函数的隐式this指针基础认知掌握成员访问规则类内任意访问类外只能访问public成员掌握类成员基础内存特性成员函数不属于单个对象多个对象共享同一份成员函数代码建立C类工程编码规范区分好习惯与不良写法一、成员变量属性成员变量用来保存对象自身的数据每个实例对象拥有独立一份成员变量。一般放在private禁止外部直接修改保证封装性命名规范推荐加前缀m_例如m_name、m_age一眼区分局部变量和成员变量#include iostream #include string using namespace std; class Person { private: // 成员变量私有外部不可直接访问 string m_name; int m_age; public: // setter 设置成员变量 void setName(string name) { m_name name; } void setAge(int age) { // 增加数据校验 if(age 0 age 150) { m_age age; } else { cout 年龄输入非法 endl; } } // getter 获取成员变量 string getName() { return m_name; } int getAge() { return m_age; } }; int main() { Person p1; p1.setName(张三); p1.setAge(20); cout p1.getName() p1.getAge() 岁 endl; return 0; }二、成员函数行为成员函数是类内部定义的函数用来操作本类的成员变量。成员函数代码存放在代码段所有对象共用一份成员函数不会每个对象都复制函数指令成员函数内部自带隐式this指针指向调用这个函数的对象实例成员函数可以访问本类所有成员不管是public还是privatethis指针简单理解p1调用setAge时this指向p1p2调用setAge时this指向p2。 完整this示例class Person { private: int m_age; public: void setAge(int age) { this-m_age age; // this-可以省略编译器自动补全 // 等价于 m_age age; } };三、核心内存特性重点每个对象独立分配成员变量内存对象之间互不干扰成员函数不占用对象内存多个对象共享函数代码this指针是成员函数形参编译阶段自动添加用来区分是哪个对象在调用函数验证小实验sizeof(Person)只会统计成员变量占用大小成员函数不计入。四、C类基础工程编码规范✅ 推荐规范成员变量默认放private对外提供getter/setter读写增加数据校验成员变量命名m_xxx前缀区分局部变量、全局变量类名采用大驼峰Person、Student成员函数小驼峰setName、getAge类定义末尾加分号新手高频漏写类的声明和实现分离简单示例可写一起工程项目建议头文件声明、cpp实现头文件与源文件分离极简示例// Person.h #pragma once #include string using namespace std; class Person { private: string m_name; public: void setName(string name); string getName(); };// Person.cpp #include Person.h void Person::setName(string name) { m_name name; } string Person::getName() { return m_name; }不推荐陋习把所有成员全部写public直接外部修改成员变量破坏封装成员变量和局部变量同名不做区分可读性差类定义末尾忘记分号引发诡异编译报错成员函数内不做参数校验任由非法数据写入成员变量五、高频坑点总结误区每个对象都会单独保存成员函数。 函数代码共享只有成员变量每个对象独立。类外只能访问public成员private成员只能在类内部访问。this指针仅存在于非静态成员函数中静态成员函数没有this指针后续章节讲解静态。对象创建后成员变量不会自动初始化直接使用会得到随机值。解决方法使用构造函数初始化下一节讲解。六、本节思考题一个类有2个对象p1、p2修改p1的m_age会不会影响p2的m_age为什么sizeof统计类大小的时候成员函数会不会占用空间为什么工程代码里成员变量优先放到private而不是publicclass Test { private: int m_val; public: void setVal(int val) { m_val val; } }; int main() { Test t; t.setVal(10); return 0; }问t调用setVal时this指针指向谁m_val val底层等价于什么写法下期预告下一节构造函数与初始化列表解决const、引用成员初始化坑点。
返回列表