C++类和对象第一关

一:类的定义

(一)类的定义

(1)类的定义格式:

class name{
// 类成员变量
// 类方法(函数)
};

class是定义类的关键字,name为定义的类的名字,后面的花括号里面包含有两部分:成员变量成员函数

在c++中struct也可以定义类,有什么区别呢?

struct定义的类成员默认是public的,class定义的类默认是private的,struct照常可以定义结构体。

// 结构体
struct Stu {string _name;// 前置_float _height;// 后置_int _ID;//m_int _age;
};// 学生类
struct Stu {// 成员变量string _name;float _height;int _ID;int _age;// 成员函数string GetName(){return _name;}int GetAge(){return _age;}
};

代码风格:为了使成员变量易于区分,通常在前面加_或者后面加_或者m_

class Stu {string _name;// 前置_float height_;// 后置_int m_ID;//m_int _age;// 成员函数string GetName(){return _name;}int GetAge(){return _age;}
};

(二)访问限定修饰符

访问限定修饰符是为了限制规定用户对类的使用权限

访问限定符有三个:

public

private

protected

public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访问。

访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌,如果后⾯没有访问限定符,作⽤域就到}即类结束。

class Stu {
private:string _name;// 前置_float height_;// 后置_int m_ID;//m_int _age;// private作用位置到这里
public:// 成员函数string GetName(){return _name;}// 上一个public作用位置到这里
public:int GetAge(){return _age;}
};

代码风格:

⼀般成员变量都会被限制为private/protected,需要给别⼈使⽤的成员函数会放为public。

(三)类域

上一篇C到C++基础知识入门提到C++中域有函数局部域,全局域,命名空间域,类域。
这里的类域就是其一种。因为类域也有隔离,所以,如果要在外部定义类的成员时要在类里面添加上声明,在定义的时候加上类的域解析(函数返回值+类名+函数名+::)

// 定义一个栈的类
class stack {
//private:
public:int _capacity;int* _arr;int _top;public:// 函数声明void Init(int n = 4);// 缺省值给在声明里面
};// 函数定义不在类里面就要使用::域解析运算符来定义
void stack::Init(int n)
{_arr = nullptr;_capacity = 0;_top = 0;
}int main()
{stack st;st.Init();return 0;
}

二:对象——类的实例化

(一)对象的概念

(1)概念:对象是类的实例化,就像是一张设计图纸一样,根据图纸可以建造出很多的房子,而这里的房子就是对象,一张图纸可以建造出框架一样但是装修不一样的各式各样的房子,类和对象是一对多的关系。

(2)类也有空间,类在定义的时候就开辟了一段空间,遵从结构体内存对齐规则,它的大小在定义的时候就确定了。

(二)对象的大小

(1)对象和C的结构体一样,为了提高内存提取数据对的效率同样存从内存对齐规则。具体的内存对齐规则请看这篇文章结构体详解。

(2)对象只存储成员变量,不给成员函数分配空间,成员函数存储在代码段。

定义两个栈,有函数和没有函数大小都是一样的。

class stack {int _capacity;int* _arr;int _top;void init(int n){_arr = nullptr;_capacity = 0;_top = 0;}
};class stack2 {int _capacity;int* _arr;int _top;/*void init(int n){_arr = nullptr;_capacity = 0;_top = 0;}*/
};int main()
{stack st;stack2 st2;cout << "有函数:" << sizeof(st) << endl;cout << "没有函数:" << sizeof(st2) << endl;return 0;
}

(3)当对象没有成员的时候,会给对象分配一个字节的空间。

class stack {/*void Init(int n){}*/
};int main()
{stack st;cout << sizeof(st) << endl;return 0;
}

三:this指针

(1)定义:编译器编译后,类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类类型的指针,叫做this指针。

(2)C++规定不能在实参形参的位置显⽰的写this指针(编译时编译器会处理),但是可以在函数体内显⽰使⽤this指针

(3)this指针的定义:this指针是类类型的指针,默认使用const修饰,不可以修改,如:

this++;

这种是不行的

下面来看代码理解:

class Date {
private:int _year;int _month;int _day;public:void init(int year, int month, int day) // 初始化{this->_year = year;this->_month = month;this->_day = day;}// 这里有一个影藏的this指针: void Print(Date* const this)void Print(){//this++;——这种是不允许的cout << this->_year << "/" << this->_month <<"/"<< this->_day << endl;}
};int main()
{Date d1;Date d2;d1.init(2024, 06, 23);d1.Print();// 这里其实是隐含的&d1:Print(&d1)//这种是不允许的: d1.Print(&d1);不可以显示的使用d2.init(2034, 07, 03);d2.Print();// 同上,这里其实和C语言的函数传地址差不多return 0;
}

this指针是成员函数的形参,所以也不存储在对象中,有些编译器会存放在寄存器里(vs),一些会随函数存放到开辟的函数栈帧里。

欢迎留言讨论指出不恰当或者不对的地方。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1547065.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

助力降本增效,ByteHouse打造新一代云原生数据仓库

随着数据量的爆炸式增长、企业上云速度加快以及数据实时性需求加强&#xff0c;云原生数仓市场迎来了快速发展机遇。 据 IDC、Gartner 研究机构数据显示&#xff0c;到 2025 年&#xff0c;企业 50% 数据预计为云存储&#xff0c;75% 数据库都将运行在云上&#xff0c;全球数据…

DK5V100R10SL贴片TO252功率12V4.3A同步整流芯片

概述DK5V100R10SL是一款简单高效率的同步整流芯片&#xff0c;只有A&#xff0c;K两个功能引脚&#xff0c;分别对应肖特基二极管PN管脚。芯片内部集成了100V功率NMOS管&#xff0c;可以大幅降低二极管导通损耗&#xff0c;提高整机效率&#xff0c;取代或替换目前市场上等规的…

双十一数码产品有哪些? 2024年度双十一数码好物推荐

每年双十一来临都是更新手机、平板或者电脑、耳机的绝佳时机。年末也让一年来发布的新机器有了更大的优惠空间再加上平台补贴&#xff0c;绝对是实打实的划算。今天给大家总结了几款双十一价格刷新新低的数码好物&#xff0c;真的要看过再下单&#xff0c;不然买贵就吃亏了。 …

UGUI动态元素大小的滑动无限列表

效果与使用说明 效果 可以滑动无限列表&#xff08;严格来说也和常规的不太一样&#xff09;可以通过曲线调整元素大小 使用说明 列表元素位于脚本挂载处的直接子级最大的元素位于脚本挂载元素的pivot处水平列表的对齐依据是所有元素pivot都在一条线上默认在最左侧和最右侧元…

kafka下载配置

下载安装 参开kafka社区 zookeeperkafka消息队列群集部署https://apache.csdn.net/66c958fb10164416336632c3.html 下载 kafka_2.12-3.2.0安装包快速下载地址分享 官网下载链接地址&#xff1a; 官网下载地址&#xff1a;https://kafka.apache.org/downloads 官网呢下载慢…

基于Node.js+Express+MySQL+VUE实现的计算机毕业设计共享单车管理网站

单车信息选择骑行 骑行状态留言公告/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序 功能如下&#xff1a; 一、开发目标 在共享经济日益盛行的今天&#xff0c;共享单车作为一种绿色、便捷的出行方式&#xff0c;已经深入人们的日常生活。然而&#xff0c;随着共享…

解读滁州少儿自闭症寄宿制学校:为孩子重新定义未来

为自闭症儿童点亮希望之光&#xff1a;星贝育园自闭症儿童寄宿制学校的温暖之旅 在繁华与喧嚣交织的都市一隅&#xff0c;广州的星贝育园自闭症儿童寄宿制学校如同一座温馨的灯塔&#xff0c;为那些在社交与沟通海洋中迷失方向的小小航船指引着方向&#xff0c;重新定义了他们…

win 录屏软件有哪些?5个软件帮助你快速进行电脑录屏。

win 录屏软件有哪些&#xff1f;5个软件帮助你快速进行电脑录屏。 在 Windows 系统上录屏操作十分常见&#xff0c;无论是制作教程、记录游戏片段&#xff0c;还是录制会议和演示文稿&#xff0c;都需要一个高效、稳定的录屏软件。以下是五款适合 Windows 系统的录屏软件&…

docker - maven 插件自动构建镜像(构建镜像:ebuy-docker:v2.0)

文章目录 1、docker服务端开启远程访问2、在pom.xml文件plugins下添加Maven的docker插件3、编写dockerfile文件4、执行maven的打包命令5、查看 镜像 ebuy-docker:v2.06、创建 容器 ebuy-dockerv2.0 上面手动构建镜像的过程比较繁琐&#xff0c;使用Maven的docker插件可以实现镜…

混合专家模型在大模型微调领域进展

前言&#xff1a;随着大规模语言模型&#xff08;LLM&#xff09;的快速发展&#xff0c;人工智能在自然语言处理领域取得了巨大的进步。在将大模型转化为实际生产力时&#xff0c;不免需要针对实际的任务对大模型进行微调。然而&#xff0c;随着模型规模的增长&#xff0c;微调…

【最新华为OD机试E卷-支持在线评测】分苹果(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

[Linux][进程][进程的七种状态]

进程状态是操作系统用来管理进程的一种手段&#xff0c;操作系统通过动态的调整进程状态来合理的分配资源&#xff0c;维护整个系统的生态。 // Linux内核对进程各个状态的定义&#xff0c;Linux系统的进程的状态不考虑/* * The task state array is a strange "bitmap&qu…

尚庭公寓-接口定义

5. 接口定义 5.1 后台管理系统接口定义 5.1.1 公寓信息管理 5.1.1.1 属性管理 属性管理页面包含公寓和房间各种可选的属性信息&#xff0c;其中包括房间的可选支付方式、房间的可选租期、房间的配套、公寓的配套等等。其所需接口如下 房间支付方式管理 页面如下 所需接口如…

【笔记】如何将本地的.md变成不影响阅读的类pdf模式

在1处搜索markdown viewer 在2处勾选url复选框 将需要阅读的md文件的本地路径去除双引号&#xff08;如果没有双引号不必做任何处理&#xff09; 直接放进浏览器url地址栏 正常显示图片与文字 解决

如何将泰语入门提高到精通呢?

要精通泰语&#xff0c;需要从基础的字母和发音开始学习&#xff0c;并通过积累词汇、频繁练习口语、沉浸在语言环境中来不断提高。参加在线课程或找专业教师进行系统性学习也很有帮助。此外&#xff0c;利用各种教材和在线资源&#xff0c;以及保持持续和一致的学习态度&#…

【线程】线程池

线程池通过一个线程安全的阻塞任务队列加上一个或一个以上的线程实现&#xff0c;线程池中的线程可以从阻塞队列中获取任务进行任务处理&#xff0c;当线程都处于繁忙状态时可以将任务加入阻塞队列中&#xff0c;等到其它的线程空闲后进行处理。 线程池作用&#xff1a; 1.降…

Teams集成-订阅事件处理

在Teams会议侧边栏应用开发-会议转写-CSDN博客的基础上&#xff0c;使用/delta接口尝试获取实时转写&#xff0c;发现只能更新了一次&#xff0c;然后就不再更新了&#xff0c;想尝试使用订阅事件去获取转写&#xff0c;发现也不是实时的&#xff0c;当会议结束时&#xff0c;订…

排序题目:对角线遍历 II

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;对角线遍历 II 出处&#xff1a;1424. 对角线遍历 II 难度 6 级 题目描述 要求 给定一个二维整数数组 nums \texttt{nums} nums&#xff0c;将 …

阅读记录:iCaRL: Incremental Classifier and Representation Learning

1. Contribution 提出了一种新的训练策略&#xff0c;iCaRL&#xff1a;允许以增量方式学习&#xff1a;只需要同时存在一小部分类别的训练数据&#xff0c;新类别可以逐步添加。同时学习分类器和数据表示&#xff1a;iCaRL能够同时学习强大的分类器和数据表示&#xff0c;这与…