当前位置: 首页 > news >正文

C++面对对象

一,类

1.1 定义

class 为定义类的关键字,className为类的名字,{ }中为类的主体,注意类定义结束时后面的分号。

类中的元素称为类的成员:类中的数据称为“类的属性”或者成员变量;类中的函数称为类的方法或者成员函数。

class className { //类体:由成员函数和成员变量组成 }; // 注意结束时后面加上分号

1.2 类的两种定义方式:

1.声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。

//人 class Person { public: //显示基本信息 void showInfo() { cout << _name << "_" << _sex << "-" << _age << endl; } public: char*_name; char*_sex; char*_age; }

2.声明放在.h文件中,类的定义放在.cpp文件中

声明放在类的头文件person.h中

定义放在类的实现文件中

1.3类的访问限定符及封装

1.访问限定符

C++通过public(公有),private(私有),protected(受保护)三个访问限定符,来控制类的成员是否能直接/间接/无法或许。

C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。

说明:

1.public修饰的成员在类外可以直接被访问

2.protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)

3.访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现为止

4.class的默认访问权限为private,struct为public(简单理解在默认访问权限下class中无法进行对于对象内容的修改而struct中可以进行)

class Student_Class { string name; int age; public: Student_Class(string n, int a) { name = n; age = a; } void showInfo() { cout << "class" << "姓名:" << name << " 年龄:" << age << endl; } }; struct Student_Struct { string name; int age; public: Student_Struct(string n, int a) { name = n; age = a; } void showInfo() { cout << "Struct" << "姓名" << name << " 年龄" << age << endl; } }; int main() { Student_Class sc("张三", 20); { sc.showInfo(); //sc.name = "李四"; //sc.age = 18; } cout << "------------------------------" << endl; Student_Struct ss("李四", 19); ss.showInfo(); ss.name = "王五"; ss.age = 22; ss.showInfo(); return 0; }

若按照上方代码执行结果如下图所示

若将上方代码中的注释去掉则会出现以下报错。

在C语言中struct是用来定义结构体的。

在C++中,兼容C的struct定义结构体的用法。但是同时struct也可以用来定义类。

在C++中使用class和struct定义类的区别-->默认的访问限定符。

2.封装

面向对象的三大特性:封装,继承,多态

1.将数据和方法放到定义一起

2.把想给你看到的数据给你看,不想给你看封装起来

1.4类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域

public:对外暴露的接口 PrintPersonInfo(),外部可调用

private:封装内部数据_name/_gender/_age,外部无法直接访问,只能通过类内函数操作。

Person:: :作用域解析符,表明这个函数属于Person类

函数内部可以直接访问private成员变量,因为它是类的成员函数,拥有访问权限。

1.5类的实例化

类的实例化相当于是将一个设计图纸上的内容实际造出来,本质为给对象分配内存,让类中声明的成员变量有了实际的存储空间,类的成员函数也能被这个具体对象调用。

#include<iostream> #include<string> using namespace std; //创建学生类 class Student { public: //成员函数:操作数据的行为 void setInfo(string n,int a) { name = n; age = a; } void showInfo() { cout << "姓名:" << name << ",年龄:" << age << endl; } private: //成员变量:仅声明,无实际内存 string name; int age; }; int main() { //类的实例化:创建对象(分配内存) Student s1; Student s2; //实例化后进行调用成员函数进行操作 s1.setInfo("张三", 20); s2.setInfo("李四", 19); s1.showInfo(); s2.showInfo(); return 0; }

问题1:为什么对象中只存储成员变量,不存储成员函数?

成员变量为“数据状态”,每个对象的状态独立且唯一,必须单独存储。

成员函数为“行为逻辑”,所有对象的同一行行为逻辑完全相同,公用同一份代码。

若存储成员函数的相同函数就会导致浪费空间占用存储。

问题2:如何计算一个实例化出的对象的大小,计算成员变量之和,并且考虑内存对齐规则?

//类中既有成员变量,又有成员函数 class A1 { public: void f1() { } private: int _a; }; //类中仅有成员函数 class A2 { public: void f2() { } }; //类中什么都没有------空类 class A3 { }; int main() { cout << sizeof(A1) << endl; cout << sizeof(A2) << endl; cout << sizeof(A3) << endl; return 0; }

如上图所示没有成员变量的类大小是1,这里一个字节不是为了存数据,而是为了占位表示它存在。

二,this指针

2.1定义

this指针是C++编译器隐式为每个非静态成员函数添加的隐藏参数,其本质是

1.指向调用该成员函数的对象的指针(类型为 类名* const,指针本身不可修改)。

2.编译器自动将对象地址传递给this,函数内部通过this访问对象的成员变量/成员函数。

3.this指针存在于栈上(函数调用时入栈),不占对象的内存看见没。

2.2示例

// 包含标准输入输出头文件 #include <iostream> // 引入std命名空间,避免每次写std::cout/std::endl using namespace std; class Date { public: void Init(int year, int month, int day) { // this指针显式使用是合法的(编译器隐式添加,此处手动写仅为演示) this->_year = year; this->_month = month; this->_day = day; } void Print() { cout << this->_year << "-" << this->_month << "-" << this->_day << endl; } private: int _year; int _month; int _day; }; int main() { Date d1; // 通过对象调用成员函数,编译器自动传递&d1给this指针 d1.Init(2026, 3, 14); d1.Print(); return 0; }

三,构造函数

3.1定义

构造函数是特殊成员函数,其核心作用是对象实例化时自动调用,用于初始化成员变量,而不是去开空间去创建对象。

3.2特性

1.函数名于类名相同(比如Date类的构造函数名就是Date);

2.无返回值(连void 都不能写,不是返回空);

3.实例化对象时编译器自动调用对应的构造函数,且仅调用一次;

4.构造函数可以重载;

http://www.jsqmd.com/news/484750/

相关文章:

  • 【即梦AI提示词】生图提示词推荐
  • 探讨标远精工加工中心详细介绍,其价格多少钱合适 - 工业推荐榜
  • SecGPT-14B开源可部署:云起无垠发布首个专注网络安全的14B大模型
  • OpenClaw橙皮书
  • 2026特殊场合轻奢高跟鞋优质品牌推荐 - 资讯焦点
  • ZooKeeper集群搭建
  • AC2100 OpenWrt 多账号单线多拨实战指南
  • 2026铝镁锰屋面板图纸深化设计机构推荐,看哪家口碑好? - 工业设备
  • 鸿蒙开发实战:5分钟搞定系统级位置模拟器(附完整代码)
  • 机器学习和深度学习基础
  • 【紧急预警】MCP v2.8.1+本地连接器存在未公开的Connection Pool饥饿漏洞(CVE-2024-MCP-003已确认,补丁将于72小时后失效)
  • 不想花冤枉钱?选降AI工具看这一篇就够了 - 我要发一区
  • fail2ban实战:从服务器被黑到构建主动防御体系
  • 通义千问3-Reranker-0.6B实战案例:直播带货话术与商品信息匹配
  • 如何用Dify在24小时内完成传统需2周的人工评估闭环?——金融客服场景下LLM-as-a-judge SLO达标实践白皮书
  • AI赋能智能车竞赛:使用快马平台大模型优化车辆决策算法
  • 哈尔滨考研实力机构靠谱吗,深度剖析各机构优势 - 工业品牌热点
  • ZooKeeper连接超时问题深度解析:从配置优化到网络排查
  • STEP3-VL-10B部署案例:边缘计算节点部署10B模型实现离线多模态推理
  • Cesium 自定义底图加载策略:从禁用默认Bing地图到灵活切换影像源
  • QPSK调制解调的FPGA设计及详细实验文档
  • 万本控油蓬松洗发水实测分析:长效控油与头皮养护双效测评 - 资讯焦点
  • Ubuntu系统开机自动配置热点全攻略
  • YOLOE实战指南:如何自定义类别名称列表实现零样本迁移
  • Wan2.2-T2V-A5B Java开发实战:SpringBoot微服务集成指南
  • 2026优质NMN品牌权威筛选榜:基于顶尖科研成果,教你理性选对靠谱品牌 - 资讯焦点
  • 从IDT到滤波器:揭秘叉指换能器的关键设计参数与性能权衡
  • R语言设备故障预测落地难?揭秘90%工程师忽略的4个数据预处理致命陷阱
  • 知网/维普/万方三大平台通吃的降AI工具有哪些 - 我要发一区
  • Wan2.1视频生成效果体验:实测多种提示词,看看AI的创造力