ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

C++ 类和对象 (上)

C++ 类和对象 (上) 类 什么是类?类是自定义数据类型把数据成员变量 和操作数据的函数成员函数封装在一起类是模板对象是根据模板造出来的实例 类的定义// 类定义classPerson{// 访问限定符public:voidshow()// 成员函数{coutnameendl;}// 访问限定符private:string name;// 成员变量intage;// 成员变量};// 注意这个 ; 不能省略class 为定义类的关键字Person 为这个类的名字类中的变量称为类的成员变量类中的函数称为类的成员函数定义在类中的成员函数默认为 inline 访问限定符用来控制类里面的成员变量 / 函数能不能在类外面被访问通俗解释 :public公有的对外公开接口谁都能访问类比房子大门任何人都可以走private私有的只有类自己内部代码能访问子类、外部全部不能碰类比卧室只有房主本人能进一般成员变量都放 private防止外部随便乱改这就是封装思想class 定义成员没有被访问限定符修饰时默认为 privateprotected保护的类内部可以访问继承的子类可以访问但普通外部代码不行类比家里书房房主和房主孩子可以进外人不行 只有写继承的时候才会大量用到单独类基本不用 类域用 class 大括号 { } 包裹起来的区域就是类域// 类域示例classA{// 进入类域 Apublic:voidfunc();intx;};// 离开类域 A类域是一个独立的名字空间 , 在类内部 , 可以直接使用类里的成员 , 但在类外面访问必须加对象.或者类名::成员函数定义在类外的情况类内部只写函数声明函数的具体实现函数体放在类外面必须用类名::域解析运算符告诉编译器这个函数属于哪个类域// 成员函数定义在类外classStudent{public:// 类内只有函数声明没有函数体voidsetAge(inta);voidshowInfo();private:intage;};// 在类外 定义 函数voidStudent::setAge(inta){// 成员函数隐含this指针可以直接访问类的成员agea;}// 在类外 定义 函数voidStudent::showInfo(){coutageendl;}核心要点 :类名::绝对不能丢::是域解析符号用来标记这个函数属于Student这个类域如果不写Student::就变成一个全局普通函数和类没有任何关系编译报错类外成员函数仍然属于这个类的成员✅ 可以访问类内所有成员包括 private 私有成员✅ 函数调用时依然会接收隐含的 this 指针和写在类内的区别写在类里面函数隐式变成 inline 内联函数写在类外面默认不是 inline , 想要内联需要手动加 inline 实例化类只是一张图纸类型本身不占内存实例化就是按照这张图纸在内存中创建出一个实实在在的对象// 类图纸没有内存分配classStudent{public:voidshow();private:intage;};// 实例化创建对象 s1、s2分配内存Student s1;Student s2; 注意 :实例化的时候只分配成员变量的内存成员函数存放在代码段所有对象共用同一份函数代码不会每个对象都存一份成员函数所以 s1 和 s2 共享 Student::show( ) 的代码实例化的对象也要符合结构体中的内存对⻬规则 this 指针this 是成员函数里隐含的指针参数指向当前调用这个成员函数的对象// this指针 示例classStudent{public:voidsetAge(inta){// 等价 age a;this-agea;}private:intage;};intmain(){Student s1;// 实例化s1.setAge(20);// 编译器底层转化Student::setAge(s1, 20);return0;}this指针 关键性质 :this 指针是成员函数的隐式形参由编译器自动传入普通全局函数没有 this只有非静态成员函数才有 this静态成员函数没有 thisthis 的类型类名 * const对于Student *const this的几个注意点 :对 this 重新赋值不行对 this 解引用可以thisnullptr;// ❌ 报错this-age20;// ✅ 合法可以修改对象里面的数据存储位置不是对象的成员不占用对象内存一般放在栈中, 对象内存里只有成员变量
返回列表