C++类的理解与类型名,类的成员,两种定义方式,类的访问限定符,成员访问,作用域与实例化对象

news2024/12/29 11:26:47

面向过程和面向对象初步认识

  1. C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题
    在这里插入图片描述
  2. C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成
    在这里插入图片描述

面向对象特征之一:封装

  1. 封装相当于就是说把某些数据与方法放在一起,然后不想给你看到,就变成私有,想让你看到的就变成公有。
  2. 封装的本质是一种更好的管理,让用户更加方便的使用类,封装是一种更好的管理,可以杜绝一些不规范的行为,封装起来的目的就是为了不是让你随便去玩,而是为了让你按照他一定的规则去玩。
  3. 封装的第一步就是把它给围起来,然后放到一起。C当中数据与方法都是分离的,C++就没有进行分离。C当中是不封装的,数据与方法都分离,太自由了。
  4. C++当中类的特性就体现了封装
  5. 一个具体的例子就是汽车它有很多复杂的零件。但他只有三个东西是留给你的,油门,方向盘和刹车。你只需要管这三个东西就行,至于发动机里面是怎样运转的,车是怎么驱动的?你不需要去管,你也不需要去懂。他把具体发动机,油门,刹车等的实现过程都封装起来,然后只给你留着三个接口。
  6. 面向对象的三大特性:封装、继承、多态。在类和对象阶段,主要是研究类的封装特性,那什么是封装呢?
  7. 封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节仅对外公开接口来和对象进行交互
  8. 封装本质上是一种管理,让用户更方便使用类。比如:对于电脑这样一个复杂的设备,提供给用户的就只有开关机键、通过键盘输入,显示器,USB插孔等,让用户和计算机进行交互,完成日常事务。但实际上电脑真正工作的却是CPU、显卡、内存等一些硬件元件。
  9. 对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如何设计的等,用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可。
  10. 在C++语言中实现封装,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用。

C++类的引入

  1. 在c++当中就已经把struct结构体升级成了类,因为c++它兼容c,所以struct以前的用法都是适用的。
  2. 但与此同时,struct已经升级成了类。
  3. C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。比如:之前在数据结构初阶中,用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现,会发现struct中也可以定义函数。
  4. 此时此刻struct就是定义了一个类,如struct Stack,这个Stack就是类名,类名是可以直接作为一个类型,所以说在语法当中就可以直接写Stack st; 这样子(C不能这样用)。
  5. 如:
struct Stack
{
	int* _p;
	int _top;
	int _capacity;
	void Init(int defaultcapacity = 5)
	{
		_p = (int*)malloc(sizeof(int) * defaultcapacity);
		if (_p == NULL)
		{
			perror("malloc failed");
			return;
		}
		_top = 0;
		_capacity = defaultcapacity;
	}
	void Push(int x)
	{
		//扩容判断
		_p[_top++] = x;
	}
	int Top()
	{
		return _p[_top - 1];
	}
	void Destroy()
	{
		free(_p);
		_p = nullptr;
		_top = 0;
		_capacity;
	}
};
  1. 在c++当中,这个struct定义的类当中可以去玩函数,这样子的好处就非常多,比方说举个例子,在以前学数据结构的时候,对于每一个数据结构都有初始化与销毁,要是插入与删除等操作,在写相对应的函数的时候,必须得加上前缀以示区分,而在现在有了Struct定义的类,而且类当中也可以去定义函数,所以说比方说可以给你一个类叫做栈,一个类叫队列,然后在里面可以各自玩各自的。
  2. C++还可以在struct定义的一个类当中再去定义函数,在这个类里面拥有成员变量(其实说白了就是以前知道的那些结构体变量),与此同时,这个类里面还支持拥有成员函数(所以说在类当中是可以去定义函数的)。也就是说类将数据与方法放到了一起

类的理解与类型名

1. 是更高级的自定义类型
2. 该自定义类型里面首先有成员变量
3. 更高级的是该自定义类型里还有一套针对本类的专属套餐

class Person//该自定义类型名就是Person
{
public:
	void ShowInfo()
	{}
private:
	char* name;
	char* sex;
	int age;
	char* addr;
	char* job;
};

如上:类型名就是Person

类的成员(类的属性/成员变量 + 类的方法/成员函数)

  1. 上面结构体的定义,在C++中更喜欢用class来代替,虽然类可以用struct定义,但也可以用class去定义,与刚才讲了struct定义的类没有任何差异。
class className
{
		// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号
  1. class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。
  2. 类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数
  3. 并且C++里面他认为这个类域是一个整体,里面成员没有先后顺序之分。

类定义方式1

class Person
{
public:
	void ShowInfo()
	{
		cout << name << endl;
		cout << sex << endl;
		cout << age << endl;
		cout << addr << endl;
		cout << job << endl;
	}
private:
	char* name;
	char* sex;
	int age;
	char* addr;
	char* job;
};
  1. 注意:声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。就看你这个函数是不是足够的简单,短小,但如果说类当中的成员函数非常长的话,具体他是不是那个连函数的话还是要编译器决定。(内联函数问题)
  2. 在类当中如果说有个函数是内联函数的话,那应该在类当中去直接定义,因为对于内联函数而言,他函数的定义,声明是不能够分开的

类定义方式2

  1. 类声明放在.h文件中,成员函数定义放在.cpp文件中.类也是可以进行声明与定义的分离,就是说把那些成员函数具体的实现逻辑全部写在定义当中,并且在定义当中去实现具体逻辑的时候,必须要加上域作用限定符,这些表明并不是一个普通的全局函数啊,是类当中的一个成员函数的定义。声明一般就放在头文件当中,然后类的成员函数具体的定义就放在具体的某个源文件当中
  2. 注意:成员函数名前需要加类名::
  3. 一般情况下,更期望采用第二种方式。注意:上课为了方便演示使用方式一定义类,大家后序工作中尽量使用第二种。
    在这里插入图片描述

类的访问限定符

在这里插入图片描述

  1. 设置了三种访问限定符,公有,保护,私有。对于公有相当于就是说可以在类外面直接访问,保护与私有不能直接访问。
  2. 在C++初阶阶段,先都认为保护和私有是一样的。
  3. 对于struct定义的类,如果你不写访问限定符的话,默认全部都是公有的;而class定义的类如果不写访问限定符的话,默认全部是私有的。如果说里面的成员变量与成员函数是公有的话,就可以在函数外面直接通过像访问结构体成员一样可以直接访问与使用
  4. public修饰的成员在类外可以直接被访问,protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  5. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  6. 如果后面没有访问限定符,作用域就到 } 即类结束。
  7. class的默认访问权限为private,struct为public(因为struct要兼容C)
  8. 只要是类,无论是用struct定义还是class定义,在里面都可以用访问限定符
  9. 注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

问题:C++中struct和class的区别是什么?

  1. C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来定义类。
  2. 和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类默认访问权限是private。
  3. 注意:在继承和模板参数列表位置,struct和class也有区别,后序给大家介绍。

类的成员访问

  1. 可以通过类的实例化对象.成员变量名/成员函数名。
  2. 可以通过类的实例化对象的指针->成员变量名/成员函数名。

在这里插入图片描述
在这里插入图片描述
4. 但如果说某个访问权限作用域被访问限定符private或protect修饰,那么此时是不能够访问的
在这里插入图片描述
在这里插入图片描述

类的作用域(类域) : : (域作用限定符是来指定命名搜索顺序的)

  1. 类定义了一个新的作用域,类的所有成员都在类的作用域中。类在定义了之后会定义一个域,就是类域。所以说在不同的类当中是互不干涉与影响的,可以出现同名的变量与函数等等
  2. 类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。所以:
    在这里插入图片描述
    在这里插入图片描述
  3. 一般默认命名搜索顺序:局部域,全局域
  4. 类中成员函数内的命名搜索顺序:自己成员函数里面的局部域,类域,全局域
  5. 现有的域:局部域,全局域,命名空间域,类域。
  6. 不同的域中可以去定义同名变量。
  7. 命名空间域与全局基本上是平行的,空间不展开或不指定是不会去访问的
  8. 对于局部域和全局域会影响生命周期,类域和命名空间域不会影响生命周期
  9. 在C/C++当中,只要是花括号定义的都是一个域。

类的实例化对象

  1. 用类类型创建对象的过程,称为类的实例化
  2. 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它;比如:入学时填写的学生信息表,表格就可以看成是一个类,来描述具体学生信息。
  3. 类就像谜语一样,对谜底来进行描述,谜底就是谜语的一个实例。谜语:“年纪不大,胡子一把,主人来了,就喊妈妈” 谜底:山羊
  4. 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量

在这里插入图片描述
6. 实例化对象才是具体有实体空间的,才是可以放数据的。这就像结构体一样,结构体定义时只是一个类型而已,定义的时候不能存数据,只有当真正用结构体类型创建出一个结构体变量之后才能够存数据。
7. 如下:这个p1就是类Person的实例化对象

#include <iostream>
using namespace std;
class Person
{
public:
	void InitInfo(int defaultcapacity = 10)
	{
		name = (char*)malloc(sizeof(char) * defaultcapacity);
		sex = (char*)malloc(sizeof(char) * defaultcapacity);
		age = 0;
		addr = (char*)malloc(sizeof(char) * defaultcapacity);
		job = (char*)malloc(sizeof(char) * defaultcapacity);
	}
	void ShowInfo()
	{
		cout << name << endl;
		cout << sex << endl;
		cout << age << endl;
		cout << addr << endl;
		cout << job << endl;
	}
	void InputName()
	{
		scanf("%s", name);
	}
	void InputSex()
	{
		scanf("%s", sex);
	}
	void InputAge()
	{
		scanf("%d", &age);
	}
	void InputAddr()
	{
		scanf("%s", addr);
	}
	void InputJob()
	{
		scanf("%s", job);
	}
private:
	char* name;
	char* sex;
	int age;
	char* addr;
	char* job;
};

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

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

相关文章

ETCD(三)操作指令

1. put put #将给定的key写入到存储 --ignore-lease[false] #使用当前租约更新key --ignore-value[false] #使用当前值更新key --lease"0" # 要附加到key的租约ID&#xff08;十六进制&#xff09; --prev-kv[false] # 返回修改前的上一个键值对2. get get #获取给…

无线洗地机哪款性价比高?高性价比的洗地机分享

虽说现在市面上清洁工具很多&#xff0c;但是要说清洁效果最好的&#xff0c;肯定非洗地机莫属。它集合了吸&#xff0c;洗&#xff0c;拖三大功能&#xff0c;干湿垃圾一次清理&#xff0c;还能根据地面的脏污程度进行清洁&#xff0c;达到极致的清洁效果&#xff0c;省时省力…

4月21日第壹简报,星期五,农历三月初二

4月21日第壹简报&#xff0c;星期五&#xff0c;农历三月初二坚持阅读&#xff0c;静待花开1. 推特拒向大模型免费开放数据&#xff01;马斯克威胁起诉微软&#xff1b;Reddit宣布不再向大模型免费开放数据&#xff0c;要求科技巨头付费使用API接口。2. 浙江&#xff1a;鼓励杭…

【JUC】Java并发机制的底层实现原理

【JUC】Java并发机制的底层实现原理 参考资料&#xff1a; CPU 缓存一致性 《Java并发编程的艺术》 【JUC并发编程】CAS到底加不加锁&#xff1f; 如何写出让 CPU 跑得更快的代码&#xff1f; 彻底理解Java并发编程之Synchronized关键字实现原理剖析 【JUC并发编程】Synchroni…

线程安全版本的单例设计模式 与 生产者消费者模型简介

目录 单例设计模式 单例设计模式——饿汉式 单例设计模式——懒汉式 单例设计模式——懒汉式&#xff08;优化步骤&#xff09; 生产者消费者模型 介绍 优点 补充&#xff1a;关于阻塞队列 单例设计模式 单例设计模式能够保证某个类的实例在程序运行过程中始终都只会存…

代码随想录Day57

1143.最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字…

Cesium 实战-最新版(1.104.0)通过异步方式初始化地球,加载影像以及高程图层

Cesium 实战-最新版&#xff08;1.104.0&#xff09;通过异步方式初始化地球&#xff0c;加载影像以及高程图层 遇到问题初始化底图初始化高程&#xff08;监听载入完成事件&#xff0c;开启关闭高程&#xff09;初始化 3dtile Cesium 最新版&#xff08;1.104.0&#xff09;变…

2021地理设计组二等奖:基于地理大数据的南昌中心城区空间功能感知与分区

一、设计背景及意义 随着经济快速发展&#xff0c;城市功能类型也越来越多&#xff0c;在空间上逐渐聚集和演化&#xff0c;形成了居住区&#xff0c;商业区等城市功能区&#xff0c;而这些功能区没有明显边界&#xff0c;确定困难&#xff0c;如使用传统人力调查方法费时费力…

PHP快速入门16-用curl发起POST和GET的请求

文章目录 前言curl介绍发送GET请求发送POST请求其他选项 总结 前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP快速入门与实战 在Web开发中&#xff0c;经常需要与其他服务器进行数据交互。而现在&#xff0c;绝大多数的接口都是基于HTTP协议的&#xff0c;因此我们需要学会…

Spring MVC的功能

1. 连接功能 1.1几种注解 RequestMapping最常用的注解之一&#xff0c;作用是用来路由注册&#xff08;注册接口的路由映射&#xff09;&#xff0c;即可修饰类也能修饰方法&#xff0c;默认情况下的RequestMapping即可接收Get请求也可以接收Post请求。也可以通过设置method来…

数据通信基础 - 数字传输系统(T1、E1)

文章目录 1 概述2 载波标准&#xff08;E1、T1&#xff09;2.1 T12.2 E1 3 扩展3.1 网工软考真题 1 概述 2 载波标准&#xff08;E1、T1&#xff09; 名称速率 Mbps信道个数每个语音信道的数据速率使用国家T11.5442456Kb/s美国、日本E12.0483264Kb/s欧洲、中国 2.1 T1 语音信…

5g网络变压器的特点与优势分析

5g网络变压器的特点与优势分析 5G网络变压器相比于2.5G和3G网络变压器&#xff0c;具有以下的特点和优势&#xff1a; 更高的频率&#xff1a;5G网络变压器可以支持更高的频率&#xff0c;从而实现更高的数据传输速率和更低的延迟。 更小的尺寸&#xff1a;5G网络变压器采用了…

为什么越来越多的网站选择海外主机?探究原因!

主机已成为网站托管的常用方式&#xff0c;但近年来越来越多的网站选择海外主机。这是为什么呢?在本文中&#xff0c;我们将探究海外主机的优点&#xff0c;并解释为什么越来越多的网站选择它们。 一、海外主机的优点 1、成本更低 海外主机的成本比独立主机低&#xff0c;因为…

文件系统和日志分析

文件系统 文件是存储在硬盘上的&#xff0c;硬盘的最小存储单位叫做"扇区”(sector)每个扇区存储512字节。一般连续八个扇区组成一个"块"(block)&#xff0c;一个块是4K大小&#xff0c;是文件存取的最小单位。操作系统读取硬盘的时候&#xff0c;是一次性连续…

哪个牌子手持洗拖一机好?热门洗地机盘点

在家居清洁中&#xff0c;越来越多的家庭选择了通过智能清洁家电来完成地面的清洁工作&#xff0c;其中洗地机时最受大家青睐的清洁工具&#xff0c;它不仅可以提高我们的清洁效率&#xff0c;还可以减轻清洁时的劳动强度。不过&#xff0c;不同品牌之间的产品的差距也是大有不…

MobPush Android SDK 集成指南

开发工具&#xff1a;Android Studio 集成方式&#xff1a;Gradle在线集成 安卓版本支持&#xff1a;minSdkVersion 19 集成准备 注册账号 使用PushSDK之前&#xff0c;需要先在MobTech官网注册开发者账号&#xff0c;并获取MobTech提供的AppKey和AppSecret&#xff0c;详情可…

世界大学机械工程TOP10,国内大学哪家强?

就在前不久世界大学的排名已经发布&#xff0c;机械工程学科是工科类学科当中代表学科之一&#xff0c;相信很多小伙伴是非常想要了解的。那么&#xff0c;我给大家介绍一下2023年QS世界大学&#xff08;机械工程&#xff09;学科排名。 本次排名比较分析了包括世界93个地区的…

智能洗地机哪个牌子更好用?好用不贵的洗地机推荐

近年来&#xff0c;智能家居产品越来越多&#xff0c;从一开始的扫地机器人到吸尘器再到后来的蒸汽拖把再到现在的洗地机&#xff0c;这些智能化清洁工具&#xff0c;不仅为我们节省了清洁的时间还拥有很好的清洁效果。其中洗地机是近年来最受大家青睐的清洁工具&#xff0c;那…

【Vulnhub】之symfonos1

一、 部署方法 在官网上下载靶机ova环境&#xff1a;https://download.vulnhub.com/symfonos/symfonos1.7z使用VMware搭建靶机环境攻击机使用VMware上搭建的kali靶机和攻击机之间使用NAT模式&#xff0c;保证靶机和攻击机放置于同一网段中。 二、 靶机下载安装 靶机下载与安…

电阻的选型

记点、 NOTE:通用的元器件选型步骤&#xff1a; A&#xff1a;明晰元器件的关机参数 B&#xff1a;结合具体的应用确定跟该应用最直接关联的关键参数 1、电阻的关键参数 2、电阻在电路的作用&#xff1a; 主要是用来是用来稳定和调节电流和电压。可作为分流器和分压器。也可…