重生之我要学C++第三天(类和对象)

news2024/11/19 1:44:13

我重生了,这篇文章就深入的探讨C++中的类和对象。

一.类的引入和定义

类的引入:在C语言中,结构体内部只能定义变量或者结构体,C++中对结构体进行了升级->类,C++的类中既可以定义变量,又可以定义函数。类中的变量叫做属性或者成员变量;函数叫做成员函数或者方法。类是属性及操作属性的方法的一个封装。

类的定义:

class classname
{//类体

    //属性


    //操作属性的一些方法
};//注意,这里有分号

类的方法声明和定义也可以分离:

//main.h
class A
{
    int a;
    int b;
    void func();//成员函数声明
};
//main.cpp
void A::func()//成员函数的定义
{
    cout<<"func()"<<endl;
}

当成员函数的声明与定义分离,定义时成员函数名前必须加上 类名:: 来限定这个定义的函数是这个类里面的。

成员变量命名习惯:成员变量的命名一般在名字前加上 _ 例如

int _a;

二.访问限定符和类的封装性

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

说明:1.public修饰的成员可以在类外直接访问。2.protected和private修饰的成员在类外不可直接访问,可以通过public修饰的成员函数间接访问。3.访问限定符的作用域是直到出现下一个访问限定符或者所在域范围结束。
class classname
{
private:
    int _date;
public:
    void ModifyDate(int date)//通过共有成员函数来访问类的成员变量(属性)
    {
        _date=date;
    }
};
封装的官方定义:
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。 通过访问权限来 隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用。

三.类的实例化

类可以直接使用吗?答案是否定的。定义出一个类并没有分配实际的内存空间,要想使用这个模板,需要用类创建对象(申请空间),我们可以使用这个对象。这就是类的实例化的过程。

一个类可以创建任意多的对象,每一个对象都是基于这个类的模板实例化出来的,每个对象又互不干涉,都是独立的个体。

#include<iostream>
using namespace std;
class People
{
private://私有域
	int _age;
	int _height;
public://公有域
	void eat()
	{
		cout << "吃饭" << endl;
	}
	void sleep()
	{
		cout << "睡觉" << endl;
	}
};
int main()
{
	People man;//用类创建对象,类的实例化
	man.eat();//实例化后使用对象
	return 0;
}

四.类的大小

类的大小如何计算呢?

	cout << sizeof(man) << endl;
	cout << sizeof(People) << endl;

这里要说明,由于同一个类不同对象的成员函数功能是相同的,所以成员函数存放在公共代码区,对象内只存放成员变量。即对象大小就是成员变量大小的总和(注意内存对齐)。

结论:一个类的大小,实际就是该类中 成员变量 之和,当然要注意 内存对齐 注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。

五.this指针

思考这样一个问题:

#include<iostream>
using namespace std;
class People
{
private://私有域
	int _age;
	int _height;
public://公有
    void inti(int age,int height)
    {
        _age=age;
        _height=height;
    }
};
int main()
{
	People p1;
    People p2;
    p1.inti(20,170);
    p2.inti(25,175);
	return 0;
}

People类中的inti成员函数既然在公共代码区,函数体中没有关于不同对象的区分,那么inti是如何区分给p1的成员变量初始化还是给p2对象的成员变量初始化呢? p1调用inti函数时,该函数如何知道应该设置p1对象还是p2对象呢?

C++ 中通过引入 this 指针解决该问题,即: C++ 编译器给每个 非静态的成员函数 增加了一个隐藏 的指针参数,让该指针指向当前对象 ( 函数运行时调用该函数的对象 ) ,在函数体中所有 成员变量 的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编 译器自动完成。例如:
void inti(int age,int height)
{
    _age=age;
    _height=height;
}

 其实是:

void inti(People* this,int age,int height)
{
    _age=age;
    _height=height;
}

 p1.inti(20,170);

其实是:

inti(&p1,20,170);
this 指针的特性
1. this 指针的类型:类类型 * const ,即成员函数中,不能给 this 指针赋值。
2. 只能在“ 成员函数 的内部使用。
3. this 指针本质上是 成员函数 的形参 ,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以 对象中不存储 this 指针 。this指针在栈中存储。
4. this 指针是 成员函数 第一个隐含的指针形参,一般情况由编译器通过 ecx 寄存器自动传 递,不需要用户传递。

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

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

相关文章

TSINGSEE青犀视频安防监控视频平台EasyCVR新增密码复杂度提示

智能视频监控平台TSINGSEE青犀视频EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTM…

BERT模型和Big Bird模型对比

BERT模型简介 BERT模型是基于Transformers的双向编码器表示&#xff08;BERT&#xff09;&#xff0c;在所有层中调整左右情境&#xff08;学习上下层语义信息&#xff09;。 Transformer是一种深度学习组件&#xff0c;能够处理并行序列、分析更大规模的数据、加快模型训练速…

sftp和scp协议,哪个传大文件到服务器传输速率快?

环境&#xff1a; 1.Win scp 6.1.1 2.XFTP 7 3.9.6G压缩文件 4.Centos 7 5.联想E14笔记本Win10 6.HW-S1730S-S48T4S-A交换机 问题描述&#xff1a; sftp和scp协议&#xff0c;哪个传大文件到服务器速度快&#xff1f; 1.SFTP 基于SSH加密传输文件&#xff0c;可靠性高&am…

Profinet转EtherNet/IP网关连接AB PLC的应用案例

西门子S7-1500 PLC&#xff08;profinet&#xff09;与AB PLC以太网通讯&#xff08;EtherNet/IP&#xff09;。本文主要介绍捷米特JM-EIP-PN的Profinet转EtherNet/IP网关&#xff0c;连接西门子S7-1500 PLC与AB PLC 通讯的配置过程&#xff0c;供大家参考。 1, 新建工程&…

护网行动:ADSelfService Plus引领企业网络安全新纪元

随着信息技术的飞速发展&#xff0c;企业网络的重要性变得愈发显著。然而&#xff0c;随之而来的网络安全威胁也日益增多&#xff0c;网络黑客和恶意软件不断涌现&#xff0c;给企业的数据和机密信息带来巨大风险。在这个信息安全威胁层出不穷的时代&#xff0c;企业急需一款强…

API攻击原理,以及如何识别和预防

攻击者知道在针对API时如何避开WAF和API网关。以下是一些公司应对API攻击快速增长的示例。 5月初&#xff0c;Pen Test Partners 安全研究员 Jan Masters 发现&#xff0c;他竟然能够在未经身份验证的情况下&#xff0c;向Peloton的官方API提出可获取其它用户私人数据的请求&am…

TEE GP(Global Platform)功能认证产品

TEE之GP(Global Platform)认证汇总 一、功能认证产品介绍 选择Functional和TEE Initial Configuration v1.1&#xff0c;然后SEARCH&#xff0c;可以看到TEE对应的功能认证产品。 二、CK810MFT V3.8, ERAGON V3, ALIBABA CLOUD LINK TEE V1.2.0 参考&#xff1a; GlobalPlatf…

知乎高赞|什么是低代码,强烈推荐!

本文摘自知乎用户吴多益的文章《从实现原理看低代码》&#xff0c;与以往抽象的定义不同&#xff0c;本文是从代码的角度定义低代码&#xff0c;有非常高的学习价值&#xff01;欢迎大家去看原文。 在讨论各个低代码方案前&#xff0c;首先要明确「低代码」究竟是什么&#xff…

微信联系人批量删除功能如何操作?删除的联系人如何恢复?

继微信推出了朋友圈置顶功能后&#xff0c;微信又推出了"批量删除好友的功能" &#xff0c;具体的操作步骤如下&#xff1a; 第一步 是点击聊天界面上的搜索框"搜索" 第二步 "搜索"排序字母&#xff0c;点击"更多联系人" 第三步 搜…

GNN的一篇入门 :A Gentle Introduction to Graph Neural Networks

原文链接 A Gentle Introduction to Graph Neural Networks (distill.pub)https://distill.pub/2021/gnn-intro/ 内容简介&#xff1a;本文是“A Gentle Introduction to Graph Neural Networks”的阅读笔记&#xff0c;因为第一次接触GNN&#xff0c;很多深奥的概念不懂&…

a柱透明屏好处和挑战详解

a柱透明屏是一种新型的汽车技术&#xff0c;它可以将车辆的a柱部分变得透明&#xff0c;提高驾驶员的视野和安全性。这项技术的出现&#xff0c;将为驾驶员提供更好的驾驶体验和更高的安全性能。 a柱是汽车车身结构中的一部分&#xff0c;位于车辆前部&#xff0c;连接车顶和车…

wangEditor初探

1、前言 现有的Quill比较简单&#xff0c;无法满足业务需求&#xff08;例如SEO的图片属性编辑需求&#xff09; Quill已经有比较长的时间没有更新了&#xff0c;虽然很灵活&#xff0c;但是官方demo都没有一个。 业务前期也没有这块的需求&#xff0c;也没有考虑到这块的扩展…

总结 Android 开发中截取字符串的方法

string str”hello word”;int i5; 1 取字符串的前i个字符 strstr.Substring(0,i); // or strstr.Remove(i,str.Length-i);substring(start,end)&#xff1a;substring是截取2个位置之间及start-end之间的字符串2 去掉字符串的前i个字符&#xff1a; strstr.Remove(0,i); // or…

HTTP vs HTTPS: 网络安全的重要转变

文章目录 一、HTTP的缺点1.1 通信使用明文可能会被窃听1.2 不验证通信方的身份就可能遭遇伪装1.3 无法证明报文完整性&#xff0c;可能已遭篡改 二、 HTTP 加密 认证 完整性保护 HTTPS2.1 HTTPS 是身披 SSL 外壳的 HTTP2.2 HTTPS采用混合加密机制2.3 HTTPS存在的问题 一、HTT…

JavaScript --简介

目录 JS可以用来做什么&#xff1f; JS在前端中几种写法: 1. 文件引用&#xff1a; 2. 页面样式 3. 行内样式 集中常见的弹框: JS基本语法&#xff1a; 变量&#xff1a; 常量&#xff1a; 数据类型&#xff1a; 基本数据类型&#xff1a; 引用数据类型&#xff1a…

解决nginx和gateway网关跨域问题Access to XMLHttpRequest

一、为什么会出现跨域问题&#xff1f; 1、什么是跨域 跨域(Cross-Origin Resource Sharing,简称 CORS) 主要是浏览器的同源策略导致的。 同源策略要求浏览器发出的 AJAX 请求只能发给与请求页面域名相同的 API 服务器,如果发给其他域名就会产生跨域问题。 2、什么是同源策略&…

9.NIO非阻塞式网络通信入门

highlight: arduino-light Selector 示意图和特点说明 一个 I/O 线程可以并发处理 N 个客户端连接和读写操作&#xff0c;这从根本上解决了传统同步阻塞 I/O 一连接一线程模型。架构的性能、弹性伸缩能力和可靠性都得到了极大的提升。 服务端流程 1、当客户端连接服务端时&…

按键消抖实现

一、使用状态机实现按键消抖 可将按键按下整个过程看做四个状态&#xff1a;按键空闲状态&#xff0c;按下抖动状态&#xff0c;稳定按下状态&#xff0c;释放抖动状态。 代码实现&#xff1a; /** Description: 状态机方式按键消抖(多按键)* Author: Fu Yu* Date: 2023-07-27…

echarts timeline时间轴鼠标移入停止

echarts timeline时间轴鼠标移入停止 修改autoplay 变量无用&#xff0c;需修改option配置项里autoplay 然后setoption重新渲染生效

Swiper横向循环焦点图实现与解析

一、实现效果 二、样式与结构代码 html: <div class"item center"><div id"certify" class"col-md-12"><div class"swiper-container"><div class"swiper-wrapper"><div class"swiper-sli…