C++ 类和对象的初步介绍

news2024/11/26 2:28:35

文章目录

  • 1.面向过程和面向对象的初步认识
  • 2.类的引入
  • 3.类的定义
  • 4. 类的访问限定符及封装
    • 4.1 访问限定符
    • 4.2 封装
  • 5.类的作用域
  • 6.类的实例化

1.面向过程和面向对象的初步认识

C语言是面向过程的,关注的过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
C++是基于面向对象的,关注的对象,将一件事情拆分成不同的对象,靠对象间的交互完成。

面向对象编程是一种常用的编程思维,它强调万物皆为对象,因此在编程时我们可以把现实世界中的事物抽象成程序中的对象,从而实现软件的设计与开发。与传统的函数编程不同,面向对象编程注重将数据与行为封装在一起,也就是对象包含数据状态,还包含可调用的行为方法。

面向对象编程的特点在于,它具有封装,继承和多态三大特性,封装意味着对象的状态和行为进行封装,使其对外只需要暴露出必要的接口,从而提高了安全性和可维护性;继承是指某个对象可以继承另一个对象的特性,从而快速构建相似属性的对象;多态是指同一种行为在不同的对象上具有不同的表现形式,即在不同的情境下,同一方法可以被不同的对象进行调用。

总之面向对象是一种强大的编程方法,它具有高度的封装性、灵活的继承性和强大的多态性,通过使用对象作为程序的基本处理单元,实现了数据和行为高度有机结合,可以使程序更加高效,结构清晰,并方便管理和扩展。

2.类的引入

C语言结构体中只能定义变量,在C++中,结构体不加可以定义变量,也可以定义函数。比如:

typedef int DataType;

struct  stack
{
	int top;
	int capacity;
	DataType* array;
	void Init() {
		top = 0;
		array = (DataType*)malloc(sizeof(DataType) * 4);
		if (array == nullptr) {
			perror("malloc");
			return;
		}
		capacity = 4;
	}
	void Push(DataType x) {
		if (top == capacity) {
			//扩容
			DataType* tmp = (DataType*)realloc(array, sizeof(DataType) * (capacity * 2));
			if (tmp == nullptr) {
				perror("realloc");
				return;
			}
			array = tmp;
			capacity *= 2;
		}
		array[top] = x;
		top += 1;
	}
	DataType Top() {
		if (top == 0) {
			cout << "stack is empty";
		}
		return array[top - 1];
	}
};

int main()
{
	struct stack ss;
	ss.Init();
	ss.Push(1);
	ss.Push(1);
	ss.Push(1);
	return 0;
}

用C语言实现的栈,结构体中只能定义变量,而现在用C++实现,会发现struct中也可以定义函数。
同时我们也发现,我们再也不用像C语言那样在传个结构体类型到函数中了,直接就可以使用结构体中的变量。
不过在C++中,我们更倾向于用class来定义类。

3.类的定义

class ClassName{
	//类的组成成分:成员变量和成员函数
};

class为定义类的关键字,ClassName为类的名字,{}中为类的主体。注意分号就是了
类体中的内容称为类的成员:类中的变量称类的属性或成员变量;类中的函数称为类的方法或者成员函数。
类的两种定义方式

  1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
class TestClass{
public:
	void Print(){
		cout<<_a<<_b<<_c<<endl;
	}	
private:
	char* _a;
	int _b;
	int _c;
};
  1. 类声明放在.h文件中,成员函数定义在.cpp文件中,注意:成员函数名前面需要加类名::
//test.h
class TestClass(){
public:
	void Print();
private:
	char* _a;
	int _b;
	int _c;
};

//test.cpp
void TestClass::Print(){
	cout<<_a<<_b<<_c<<endl;
}

在一般情况下,更期望采用第二种方式。

类中成员变量命名建议:建议在命名前或者后加上下划线。

name  ->  _name

age  ->   _age

这样的话,可以很好的类中的成员变量和其他变量。

4. 类的访问限定符及封装

4.1 访问限定符

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

  1. public修饰的成员在类外可以被直接访问。
  2. protected和private修饰的成员在类外不能直接被访问。
  3. 访问权限作用域从该修饰限定字符出现的位置开始直到下一个访问限定符出现为止。
  4. 如果后面没有访问限定符,作用域就到}截止。
  5. class的默认访问权限为private,struct的默认访问权限为public。
    提问:C++中的struct和class的区别
    回答:C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义类默认访问权限是private。
    注意:访问限定符只在编译时有效,当数据映射到内存1后,没有任何访问限定符的区别

4.2 封装

将数据和操作方法进行有机结合,隐藏对象的属性和实现细节,仅公开对外接口和对象进行交互。
封装的本质是一种管理,让用户更方便使用类。
就像诸多的电子产品,即使内部结构复杂,但对于使用者来说,不需要区关心它们的内部核心部件,只需要操作其暴露在外部的按钮就可以了,让用户与其完成交互。
在C++语言中实现封装,可以通过将数据以及操作数据的方法进行有机的结合,通过访问权限来隐藏对象内部的细节,控制那些方法可以在类外部直接被使用。

5.类的作用域

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

class Person
{
public:
	void PrintPersonInfo();
private:
	char name_[20];
	char age_;
};

//指定类域
void Person::PrintPersonIn()
{
	//...
}

6.类的实例化

用类类型创建对象的过程,称为类的实例化

  1. 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它;比如:入学时填写的学生信息表,表格就可以看成一个类,来描述学生的信息。
  2. 一个类可以实例化出多个对象,实例化出的对象,占用实际的物理空间,存储类成员变量。
int main()
{
	Person yui;//实例化对象
	yui.age_ = 18;//初始化
	return 0;
}

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

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

相关文章

OpenCV Canny()函数

OpenCV Canny()函数被用来检测图像物体的边缘。其算法原理如下&#xff1a; 高斯滤波&#xff1a;使用高斯滤波器平滑图像以减少噪声。高斯滤波器是一种线性滤波器&#xff0c;可以消除图像中的高频噪声&#xff0c;同时保留边缘信息。计算梯度强度和方向&#xff1a;使用Sobe…

教资备考--高中数学(仅为高中数学梳理)

按照高中学习数学梳理的方案进行整理

爬虫——同步与异步加载

一、同步加载 同步模式--阻塞模式&#xff08;就是会阻止你浏览器的一个后续加载&#xff09;停止了后续的解析 因此停止了后续的文件加载&#xff08;图像&#xff09; 比如hifini音乐网站 二、异步加载 异步加载--xhr(重点) 比如腾讯新闻&#xff0c;腾讯招聘等 三、同…

组合框QGroupBox设置checked属性

我们可以给组合框设置checked属性 //获取和设置checked属性是否开启 bool isCheckable() const void setCheckable(bool checkable)//获取和设置选中还是非选中 bool isChecked() const void setChecked(bool checked)效果如下&#xff1a; 如果checked属性使能之后&#xff0…

Open3D实现点云数据的序列化与网络传输

转载自个人博客&#xff1a;Open3D实现点云数据的序列化与网络传输 在处理点云数据的时候&#xff0c;有时候需要实现点云数据的远程传输。当然可以利用传输文件的方法直接把点云数据序列化成数据流进行传输&#xff0c;但Open3D源码在实现RPC功能时就提供了一套序列化及传输的…

用langchain+streamlit应用RAG实现个人知识库助手搭建

RAG原理概述 RAG&#xff08;Retrieval-Augmented Generation&#xff09; 是一种结合了信息检索和生成式人工智能技术的模型架构&#xff0c;旨在让模型生成更有根据和更准确的回答。通俗来讲&#xff0c;它让模型不只是凭借自己的“记忆”&#xff08;预训练数据&#xff09…

Java中的依赖注入(Dependency Injection, DI)详解

Java中的依赖注入&#xff08;Dependency Injection, DI&#xff09;是软件工程中的一种重要设计模式。它有助于提高系统的可测试性、可维护性和灵活性。通过依赖注入&#xff0c;组件不再负责创建它们所需的对象&#xff0c;而是通过外部的设置来提供这些对象。这种方式也与控…

无人机+无人车+机器狗:综合管控系统技术详解

无人机、无人车、机器狗的综合管控系统技术是一个集成了多种先进技术和设备的复杂系统&#xff0c;旨在实现高效、精准、协同的作业与管理。以下是对该系统技术的详细解析&#xff1a; 一、系统概述 综合管控系统通过集成无人机、无人车和机器狗等智能设备&#xff0c;结合物…

OSDU轻量化单机部署

首先更新系统 sudo apt update sudo apt upgrade -y安装docker sudo apt install -y docker.io sudo systemctl start docker sudo systemctl enable docker安装minikube curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 …

vmware Workstation16设置批量虚拟机开机自启 vmAutoStart

文章目录 前言解压压缩包一、使用步骤1.获取虚拟机所在目录2.获取vmware所在目录3.测试启动4.开机自启 二、gitee总结 前言 vmware workstation16不支持虚拟机开机自启&#xff0c;通常的办法是写脚本&#xff0c;但是有个问题就是不能启动多台虚拟机&#xff0c;因为有时候会…

Python | Leetcode Python题解之第455题分发饼干

题目&#xff1a; 题解&#xff1a; class Solution:def findContentChildren(self, g: List[int], s: List[int]) -> int:g.sort()s.sort()m, n len(g), len(s)i j count 0while i < m and j < n:while j < n and g[i] > s[j]:j 1if j < n:count 1i …

Spring框架使用Api接口实现AOP的切面编程、两种方式的程序示例以及Java各数据类型及基本数据类型的默认值/最大值/最小值列表

一、Spring框架使用Api接口-继承类实现AOP的切面编程示例 要使用Spring框架AOP&#xff0c;除了要导入spring框架包外&#xff0c;还需要导入一个织入的包org.aspectj&#xff0c;具体maven依赖如下&#xff1a; <dependency><groupId>org.springframework</gr…

JAVA-异常(通俗易懂)

目录 一、异常的概念 1.算术异常 2.数组越界异常 3.空指针异常 二、异常体系结构 三、异常的分类 1. 编译时异常 2. 运行时异常 四、异常处理 1.防御式编程 2.异常的抛出 3.异常的捕获 4.try-catch捕获并处理 5.finally 五、异常的处理流程 六. 自定义异常类…

ade20k 街景图像【数据集】及其【论文出处】ADE20K数据集 超过25000张图像的语义分割数据集

ade20k 街景图像【数据集】及其【论文出处】ADE20K数据集介绍 是一个包含超过25000张图像的语义分割数据集&#xff0c;这些图像被密集注释&#xff0c;覆盖室内和室外场景。 它由MIT发布&#xff0c;包含100个事物类别和50个物质类别&#xff0c; 用于训练和验证的图像数量分别…

(16)MATLAB仿真Nakagami-m分布1

文章目录 前言一、Nakagami分布二、MATLAB建模代码三、仿真结果画图四、总结 前言 Nakagami衰落模型最初是由于该模型与短波电离层传播的经验结果相匹配而提出的。它还用于仿真来自多个干扰源的情况&#xff0c;因为多个独立且同分布&#xff08;i.i.d&#xff09;的瑞利分布随…

线程池的实现和讲解:解决多线程并发服务器创建销毁线程消耗过大的问题

1.前言 多进程/线程并发服务器、多路I/O转接服务器的简单实现-CSDN博客 原先的多线程并发服务器&#xff0c;有多少个客户端连接服务器就有多少个线程&#xff0c;CPU需要在多个线程之间来回切换处理客户端的请求&#xff0c;系统消耗比较大(每次创建和消耗线程在操作系统内部…

linux学习--第七天(多路复用IO)

多路复用IO -阻塞IO与非阻塞IO -IO模型 IO的本质时基于操作系统接口来控制底层的硬件之间数据传输&#xff0c;并且在操作系统中实现了多种不同的IO方式&#xff08;模型&#xff09;比较常见的有下列三种&#xff1a; 1.阻塞型IO模型 2.非阻塞型IO模型 3.多路复用IO模型 -阻…

开源2+1链动模式AI智能名片O2O商城小程序源码:线下店立体连接的超强助力器

摘要&#xff1a;本文将为您揭示线下店立体连接的重大意义&#xff0c;您知道吗&#xff1f;线上越火&#xff0c;线下就得越深入经营。现代门店可不再只是卖东西的地儿&#xff0c;还得连接KOC呢&#xff01;咱们来看看门店要做的那些超重要的事儿&#xff0c;还有开源21链动模…

Authentication Lab | CVE-2019-7644 - JWT Signature Disclosure

关注这个靶场的其他相关笔记&#xff1a;Authentication Lab —— 靶场笔记合集-CSDN博客 0x01&#xff1a;JWT Signature Disclosure 前情提要 本关的考点是 JWT&#xff08;Json Web Token&#xff09;漏洞&#xff0c;JWT 是一个用于跨域认证的技术。如果你不了解 JWT&…

计算机视觉——图像修复综述篇

目录 1. Deterministic Image Inpainting 判别器图像修复 1.1. sigle-shot framework (1) Generators (2) training objects / Loss Functions 1.2. two-stage framework 2. Stochastic Image Inpainting 随机图像修复 2.1. VAE-based methods 2.2. GAN-based methods …