C++:类和对象1

news2024/9/23 11:21:55

1.类的定义

类定义在面向对象编程中是一个核心概念,它定义了对象的结构和行为。在C++中,类定义包含类的名称、数据成员(也称为属性或者字段)和成员函数(也称为方法或者操作)多个部分。数据成员定义了对象的状态,而成员函数定义了对象可以执行的操作。下面我们将堆类定义的各个部分进行更加详细的认识。

1.1类名

class为类定义的关键字,类名是一个标识符,用于表示这个类。在C++中,类名通常使用大写字母开头的驼峰命名法来命名。

例如在下面的例子1中类名为Point

1.2访问修饰符
  1. C++一种实现封装的方式,用类将对象是属性和方法结合在一起,让对象更加完善。通过访问权限选择性 的将其接口提供给外部的用户使用。
  2. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现为止。如果后面没有访问限定符,作用域就到 } 即类结束。
  3. class定义成员没有被访问限定符修饰是默认为private,struct默认为public。

C++提供了三种访问修饰符来控制类成员的访问权限:

  • public : 成员在类的外部也可以被访问。
  • protected: 成员在类的外部不可直接访问,但是在派生类(子类)中可以被访问。
  • private : 成员在类的外部和派生类中均不可直接访问,只能通过类的成员函数来访问。

 如在下例子1中:private的作用域为private出现的位置到public出现为止之间,public的作用域为public出现的位置到main函数上面最后一个花括号 } 。

例子1:
#include<iostream>
using namespace std;

class Point
{
private:
	int x;//点的x坐标
	int y;//点的y坐标

public:
	//构造函数,用于初始化点的坐标
	Point(int x = 0,int y = 0) : x(x),y(y){}

	//设置x坐标的成员函数
	void setX(int x)
	{
		this->x = x;
	}

	//设置y坐标的成员函数
	void setY(int y)
	{
		this->y = y;
	}

	//获取x坐标的成员函数
	int getX()
	{
		return x;
	}

	//获取y坐标的成员函数
	int getY()
	{
		return y;
	}
};


int main()
{
	Point myPoint;//创建一个Point对象,默认坐标为(0,0)
	cout << "Initial point: (" << myPoint.getX() << ", " << myPoint.getY() << ")" << endl;

	myPoint.setX(5); //设置x的坐标为5
	myPoint.setY(10); //设置y的坐标为10

	cout << "Updated point: (" << myPoint.getX() << ", " << myPoint.getY() << ")" << endl;

	return 0;
}

 1.3类域

 在C++中,类域是指类中定义的成员(包括变量和方法)的可见性和可访问性范围。类域是面向对象编程中的一个核心概念,它有助于实现封装、隐藏类的实现细节,并提供清晰的接口共外部使用。

1.3.1类域的定义

类域从类的左大括号 { 开始,到右大括号 } 结束。在这个范围内声明的所有成员都属于类域。

1.3.2:成员的可见性

在类域中声明的成员可以在类的内部被访问,但是它们的外部可访问性受到访问限定符(public、protected、private)的控制

 如在例子2中:私有成员name、age不能被直接访问

class Person
{
public:
	void printInfo()//公有成员函数
	{
		cout << name << ", " << age << endl;
	}
private:
	string name;//私有成员变量
	int age;//私有成员变量
};
int main()
{
	Person person;
	person.name = "Alice";//错误:不能直接访问私有成员
	person.age = 20;//错误:不能直接访问私有成员
	person.printInfo();//正确:通过公有成员函数访问私有成员
	return 0.;
}

注意:定义在类里面的成员函数默认为inline。C++中struct也可以定义类,C++兼容C中struct的用法,同时struct升级成了类,明显的变化是struct中可以定义函数,一般情况下我们还是推荐用class定义类。

2.实例化

2.1实例化概念
  1. 用类类型在物理内存中创建对象的过程,称为类实例化处对象。
  2. 类是对象进行一种抽象描述,限定了类有那些乘以变量,这些成员变量只是声明没有分配空间,用类实例化处对象时才会分配空间。
  3. 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量。就好比一张房子设计图纸是类,用图纸建筑出很多房子就是实例化。

 如下面例子3中:Point实例化出对象p1和p2

例子3:
class Point
{
private:
	int x, y;//成员变量

public:
	//构造函数
	Point(int a = 0,int b = 0) : x(a), y(b) { }

	//成员函数
	void print()
	{
		cout << "(" << x << ", " << y << ")" << endl;
	}
};

int main()
{
	//实例化Point类,创建Point对象
	Point p1(1, 2); //使用构造函数初始化x和y
	Point p2;       //使用默认构造函数,x和y都被初始化为0

	//调用成员函数
	p1.print(); //输出:(1,2)
	p2.print(); //输出:(0,0)

	return 0;
}

2.2对象大小

在C++中,类对象的大小取决于多个因素,包括类成员的类型、大小、数量以及成员变量的对齐要求。类的成员函数(方法)通常不直接计入对象的大小,因为成员函数在内存中是以代码的形式存在的,与对象实例的内存布局是分开的。但是成员函数中的任何静态成员变量会独立于对象实例存在,并且其大小也不会计入单个对象的大小中而是像全局变量一样存在于程序的静态数据区。总而言之,类对象大小的计算原则和结构体的大小计算原则一样。

计算结构体大小的对齐原则:

  1. 第一个成员在与结构体偏移量为0的地址处。
  2. 其他成员变量要对齐到其对应对齐数的整数倍的地址处。
  3. 对齐数 =  编译器默认对齐数与该成员大小的较小值。
  4. VS的默认对齐数为8
  5. 结构体的总大小为:最大对齐数(所有变量类型的最大者与默认对齐数最小)的整数倍。
  6. 可以参考文章:C语言:结构体、共用体和枚举(1)-CSDN博客

如在例子4中:类MyClass的大小为16。这是因为char本身大小为1,VS编译器默认大小为8,较小值为1,所以对齐数为1,占1个字节大小;int本身大小为4,VS编译器默认大小为8,较小值为4,所以对齐数为4,占4个字节大小;double本身大小为8,VS编译器默认大小为8,较小值为8,所以对齐数为8,占8个字节大小。

例子4:
class MyClass
{
public:
	char a;  // 1     8       1
	int b;   // 4     8       4
	double c;// 8     8       8
};

int main()
{
	cout << " Size of MyClass: " << sizeof(MyClass) << " bytes" << endl;
	return 0;
}

例子5: 
class A
{
public:
	void print()
	{
		cout << ch << endl;
	}
private:
	char ch;
	int i;
};

int main()
{
	cout << "Size of A: " << sizeof(A) << " bytes" << endl;
	return 0;
}

 

 由上面例子5:我们可以知道类的成员函数是不计入类大小的计算中的。

类A的大小为8。这是因为char本身大小为1,VS编译器默认大小为8,较小值为1,所以对齐数为1,占1个字节大小;int本身大小为4,VS编译器默认大小为8,较小值为4,所以对齐数为4,占4个字节大小.

例子6:
class B
{
public:
	void Print()
	{
		//...
	}

};

int main()
{
	cout << "Size of B: " << sizeof(B) << " bytes" << endl;
	return 0;
}

在上面例子6:我们可以看到没有成员变量的类B的大小为1,为什么没有成员变量还是1字节呢?因为如果一个字节都不给怎么表示对象存在过呢!所以这里给1字节是为了占位标识对象存在。

3.this指针

  • 编译器 编译后,类的成员函数默认都会在形参第一个位置增加一个当前类类型的指针,叫做this指针。
  • 类的成员函数中访问成员变量,本质都是通过this指针访问的。
  • C++规定不能在实参和形参的位置显示的写this指针(编译时编译器会处理),但是可以在函数体内显示使用this指针。

2.3.1主要用途

  1. 区分成员变量和局部变量:当成员变量和局部变量的名字相同时,可以通过this->成员变量名来明确指定是访问类的成员变量。如在下面例子
  2. 返回当前对象的引用:在需要返回当前引用的函数中,可以使用return *this来实现链式调用。
class Box
{
public:
	double width;

	void setWidth(double width)
	{
		this->width = width;//使用this指针来区别成员变量width和参数width

	}
};

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

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

相关文章

2024-07-16 Unity插件 Odin Inspector5 —— Conditional Attributes

文章目录 1 说明2 条件特性2.1 DisableIf / EnableIf2.2 DisableIn / EnableIn / ShowIn / HideIn2.3 DisableInEditorMode / HideInEditorMode2.4 DisableInInlineEditors / ShowInInlineEditors / HideInInlineEditors2.5 DisableInPlayMode / HideInPlayMode2.6 ShowIf / Hi…

docker安装mysql突然无法远程连接

docker安装mysql突然莫名其妙的无法远程连接 docker安装mysql突然无法远程访问问题背景发现问题排查问题解决问题总结 docker安装mysql突然无法远程访问 问题背景 大概一年前在服务器中通过docker安装mysql5.7端口映射关系是3308->3306 前期在服务器上开方了3308端口 fir…

Python用Pyqt5制作音乐播放器

具体效果如下 需要实现的功能主要的几个有&#xff1a; 1、搜索结果更新至当前音乐的列表&#xff0c;这样播放下一首是搜素结果的下一首 2、自动播放 3、滚动音乐文本 4、音乐进度条 5、根据实际情况生成音乐列表。我这里的是下面的情况&#xff0c;音乐文件的格式是 歌…

图——图的遍历(DFS与BFS算法详解)

前面的文章中我们学习了图的基本概念和存储结构&#xff0c;大家可以通过下面的链接学习&#xff1a; 图的定义和基本术语 图的类型定义和存储结构 这篇文章就来学习一下图的重要章节——图的遍历。 目录 一&#xff0c;图的遍历定义&#xff1a; 二&#xff0c;深度优先…

【MySQL】:学习数据库必须要知道的背景知识

客户端—服务器 客户端是一个“客户端—服务器”结构的程序 C&#xff08;client&#xff09;—S&#xff08;server&#xff09; 客户端和服务器是两个独立的程序&#xff0c;这两个程序之间通过“网络”进行通信&#xff08;相当于是两种角色&#xff09; 客户端 主动发起网…

CV12_ONNX转RKNN模型(谛听盒子)

暂时简单整理一下&#xff1a; 1.在边缘设备上配置相关环境。 2.配置完成后&#xff0c;获取模型中间的输入输出结果&#xff0c;保存为npy格式。 3.将onnx格式的模型&#xff0c;以及中间输入输出文件传送到边缘设备上。 4.编写一个python文件用于转换模型格式&#xff0c…

对某根域的一次渗透测试

前言 两个月之前的一个渗透测试项目是基于某网站根域进行渗透测试&#xff0c;发现该项目其实挺好搞的&#xff0c;就纯粹的没有任何防御措施与安全意识所以该项目完成的挺快&#xff0c;但是并没有完成的很好&#xff0c;因为有好几处文件上传没有绕过&#xff08;虽然从一个…

linux|多线程(一)

主要介绍了为什么要有线程 和线程的调用 和简单的对线程进行封装。 背景知识 a.重谈地址空间 我们知道物理内存的最小单元大小是4kB 物理内存是4G那么这样的单元友1M个 操作系统先描述再组织struct page[1M] 对于32位数据字长的机器&#xff0c;页表有2^32条也就是4G条&#…

springboot的JWT令牌

生成JWT令牌 依赖 <!--jwt令牌--> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> <dependency> <groupId>javax.xml.bind<…

怎样在 PostgreSQL 中优化对大数据量的分页查询?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 《PostgreSQL 中大数据量分页查询的优化之道》一、理解分页查询的基本原理二、优化分页查询的策略&…

2024年06月CCF-GESP编程能力等级认证C++编程七级真题解析

本文收录于专栏《C等级认证CCF-GESP真题解析》&#xff0c;专栏总目录&#xff1a;点这里。订阅后可阅读专栏内所有文章。 一、单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 下列C代码的输出结果是&#xff08; &#xff09;。 #include <iostr…

SwiftUI 6.0(Xcode 16)新 PreviewModifier 协议让预览调试如虎添翼

概览 用 SwiftUI 框架开发过应用的小伙伴们都知道&#xff0c;SwiftUI 中的视图由各种属性和绑定“扑朔迷离”的缠绕在一起&#xff0c;自成体系。 想要在 Xcode 预览中泰然处之的调试 SwiftUI 视图有时并不是件容易的事。其中&#xff0c;最让人秃头码农们头疼的恐怕就要数如…

Spring Cloud Gateway 自定义断言以及过滤器

1.Spring Cloud gateway介绍 Spring Cloud Gateway 是一个基于 Spring Framework 和 Spring Boot 的 API 网关服务&#xff0c;它利用了 Spring WebFlux 来提供响应式非阻塞式Web请求处理能力。它的核心功能是路由&#xff0c;即根据请求的特定规则将请求转发到后端服务&#…

DP(1500-1700)(刷题)

1.状态机模型&#xff1a;https://codeforces.com/contest/1984/problem/C2 记一下max与min状态转移即可&#xff0c;下面是AC代码&#xff1a; #include<bits/stdc.h> using namespace std; typedef long long ll; ll a[200010],t,n; ll dp[200010][2];//dp[i][0]表示…

啊?现在不懂 AI ,相当于十年前不懂电脑?

最近有关萝卜快跑的新闻铺天盖地&#xff0c;一篇篇都在唱衰&#xff0c;好像千万滴滴师傅立马就要失业了一样。 还没等多久&#xff0c;在朋友圈看到这样一句话&#xff0c;“现在不懂 AI &#xff0c;相当于十年前不懂电脑”。 我想了许久&#xff0c;最终不得不承认这个事实…

深度学习入门——误差反向传播

要正确理解误差反向传播法&#xff0c;我个人认为有两种方法&#xff1a;一种是基于数学式&#xff1b;另一种是基于计算图&#xff08;computational graph&#xff09; 前者是比较常见的方法&#xff0c;机器学习相关的图书中多数都是以数学式为中心展开论述的。因为这种方法…

达梦数据库的系统视图v$sqltext

达梦数据库的系统视图v$sqltext 在达梦数据库&#xff08;DM Database&#xff09;中&#xff0c;V$SQLTEXT 是一个系统视图&#xff0c;用于显示当前正在执行或最近执行的SQL语句的文本信息。这个视图对于监控和分析数据库中的SQL活动非常有用&#xff0c;尤其是在需要调试性…

【python】OpenCV—Coordinates Sorted Clockwise

文章目录 1、需求介绍2、算法实现3、完整代码 1、需求介绍 调用 opencv 库&#xff0c;绘制轮廓的矩形边框&#xff0c;坐标顺序为右下→左下→左上→右上&#xff0c;我们实现一下转化为熟悉的 左上→右上→右下→左下 形式 按照这样的顺序组织边界框坐标是执行透视转换或匹…

13. C++继承 | 详解 | 虚拟继承及底层实现

目录 1.定义 1.1继承的概念 1.2 继承的定义 2. 对象赋值转换 3. 继承中的作用域 a. 隐藏/重定义 (Hiding/Redefinition) b. 重载 (Overloading) c. 重写/覆盖 (Overriding) d. 编译报错 (Compilation Error) 4. 派生类的默认成员函数 构造 拷贝构造 运算符重载 析…

处理uniapp刷新后,点击返回按钮跳转到登录页的问题

在使用uniapp的原生返回的按钮时&#xff0c;如果没有刷新会正常返回到对应的页面&#xff0c;如果刷新后会在当前页反复横跳&#xff0c;或者跳转到登录页。那个时候我第一个想法时&#xff1a;使用浏览器的history.back()方法。因为浏览器刷新后还是可以通过右上角的返回按钮…