【027】C++类和对象的基本概念

news2024/10/7 14:31:18

C++类和对象的基本概念

  • 引言
  • 一、类的封装性
  • 二、定义一个类
  • 三、设计一个类
    • 3.1、示例一:设计一个Person类
    • 3.1、示例二:设计一个Cube类
  • 四、成员函数在类外实现
  • 五、类在其他源文件中实现
  • 总结

引言


💡 作者简介:专注于C/C++高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。包括C/C++、Linux、MySQL、Redis、TCP/IP、协程、网络编程等。
👉
🎖️ CSDN实力新星,社区专家博主
👉
🔔 专栏介绍:从零到c++精通的学习之路。内容包括C++基础编程、中级编程、高级编程;掌握各个知识点。
👉
🔔 专栏地址:C++从零开始到精通
👉
🔔 博客主页:https://blog.csdn.net/Long_xu


🔔 上一篇:【026】C++的内联函数、函数重载、函数的默认参数与占位参数

一、类的封装性

C++中的类封装性是指将数据和操作封装在一个单独的实体(类)中,防止外部代码直接访问对象的数据。类中的成员变量可以被声明为私有(private),以便只能通过类内部的函数来访问它们。

封装提供了以下优点:

  1. 数据隐藏:类的使用者无法直接访问私有成员变量,从而保护了数据。

  2. 可控制性:只公开必要的函数接口,可以减少不正确使用或更改数据造成的风险。

  3. 简化编程:由于用户不能直接更改数据,因此可以简化编写复杂程序时需要处理大量状态信息的过程。

  4. 提高安全性:由于私有成员变量无法直接访问,因此可以提高程序的安全性并避免未经授权对重要数据进行修改或破坏。

类将具有共性的数据和方法封装在一起,加以权限区分,用户只能通过公共方法访问私有数据。
类的权限分为:

  • private:私有。
  • protected:保护。
  • public:公共。

在类的外部,只有public修饰的成员才能访问,在没有涉及继承与派生时,private和protected是同等级别的,外部不允许访问。用户在类的外部可以通过public的方法间接访问private和protected数据。

访问属性属性对象内部对象外部
public公共可以访问可以访问
protected保护可以访问不可访问
private私有可以访问不可访问

二、定义一个类

定义类的时候系统不会为其开辟内存空间,只有当在类的外部实例化一个对象才会为其开辟空间;所以不要给类中的成员初始化。在类的内部不存在权限之分,只有在类外部才涉及权限划分,在定义类时如果没有指定权限修饰符则默认是private。

类是一个抽象的概念,类是一个类型。

定义一个类的格式:

class 类名{
private:
	// 成员变量和成员函数
protected:
	// 成员变量和成员函数
public:
	// 成员变量和成员函数
	
};

示例:

#include <iostream>
using namespace std;
class Data{
// 类中默认私有
private:
	// 成员变量和成员函数
	int a;//不要给类成员初始化
protected:
	// 成员变量和成员函数
	int b;//不要给类成员初始化
public:
	// 成员变量和成员函数
	int c;//不要给类成员初始化
	// 在类的内部没有权限之分
	void printData()
	{
		a=100;
		b=200;
		c=300;
		cout<<a<<" "<<b<<" "<<c<<" "<<endl;
	}
	
	
};

int main()
{
	// 实例化一个对象
	Data obj;
	// 类外不能访问类的私有数据和保护数据
	// obj.a=100;//error
	// obj.b=100;// error
	
	obj.c=300;//ok
	// 类中的成员函数需要对象调用
	obj.printData();
	return 0;
}

三、设计一个类

设计一个类的步骤:

  1. 思考类有哪些数据成员。
  2. 操作这些数据的成员函数有哪些。
  3. 数据设为私有,成员函数设置为共有。

3.1、示例一:设计一个Person类

比如 设计一个person类,具有name和age属性,提供初始化函数、对name读写的函数以及对age读写的函数;但是需要确保age的赋值有效范围是(0~100),超出有效范围则拒绝赋值,并提供方法输出name和age。

#include <iostream>
using namespace std;
#define STR_LEN		32
class Person {
	// 类中默认私有
private:
	// 成员变量和成员函数
	char mName[STR_LEN];//不要给类成员初始化
	int mAge;

public:
	// 在类的内部没有权限之分
	void PersonInit(const char *name,int age)
	{
		if (name == NULL)
			cout << "名字不能为空" << endl;
		else
			strncpy(mName, name, STR_LEN);
		if (age > 0 && age <= 100)
		{
			mAge = age;
		}
		else
			cout << "输入的age:" << age << "不合法" << endl;

	}
	// 设置mName
	void setName(const char* name)
	{
		if (name == NULL)
			cout << "名字不能为空" << endl;
		else
			strncpy(mName, name, STR_LEN);
	}
	// 获取mName
	char *getName()
	{
		return mName;
	}
	// 设置mAge
	void setAge(int age)
	{
		if (age > 0 && age <= 100)
		{
			mAge = age;
		}
		else
			cout << "输入的age:" << age << "不合法" << endl;
	}
	// 获取mAge
	int getAge()
	{
		return mAge;
	}
	// 显示mName和mAge
	void show()
	{
		cout << "名字:" << mName << ",年龄:" << mAge << endl;
	}
};

int main()
{
	// 实例化一个对象
	Person obj;
	obj.PersonInit("Long",20);
	obj.setName("Lion");
	obj.setAge(18);
	cout << "名字:" << obj.getName() << ",年龄:" << obj.getAge() << endl;
	
	obj.show();
	return 0;
}

输出:

名字:Lion,年龄:18
名字:Lion,年龄:18

这个过程由对象完成相关动作,面向对象编程。

3.1、示例二:设计一个Cube类

设计一个立方体类(Cube),求出立方体面子和体积,分别用全局函数和成员函数判断两个立方体是否相等。
在这里插入图片描述

  • 立方体的面积: 2 × a × b + 2 × a × c + 2 × b × c 2\times a\times b+2\times a\times c+2\times b\times c 2×a×b+2×a×c+2×b×c
  • 立方体的体积: a × b × c a\times b\times c a×b×c
#include <iostream>
using namespace std;
#define STR_LEN		32
class Cube {
	// 类中默认私有
private:
	// 成员变量和成员函数
	int mLength;
	int mWidth;
	int mHeight;

public:
	// 在类的内部没有权限之分
	void CubeInit(int L,int W,int H)
	{
		mLength = L;
		mWidth = W;
		mHeight = H;

	}
	// 设置
	void setLength(int L)
	{
		mLength = L;
	}
	// 获取
	int getLength()
	{
		return mLength;
	}
	// 设置
	void setWidth(int W)
	{
		mWidth = W;
	}
	// 获取
	int getWidth()
	{
		return mWidth;
	}
	// 设置
	void setHeight(int Height)
	{
		mHeight = Height;
	}
	// 获取
	int getHeight()
	{
		return mHeight;
	}
	// 求面积
	int getArea()
	{
		return 2 * (mHeight*mWidth + mHeight * mLength + mWidth * mLength);
	}
	// 求体积
	int getVolume()
	{
		return mLength * mWidth*mHeight;
	}

	// 类成员比较两个正方形是否相等
	bool compare(Cube &ob)
	{
		// 类内可以直接访问成员变量
		if (mLength == ob.mLength 
			&& mWidth == ob.mWidth
			&& mHeight == ob.mHeight)
		{
			return true;
		}
		return false;
	}
};

// 全局函数比较两个正方形是否相等
bool globalCompare(Cube &ob01, Cube &ob02)
{
	// 类外不可以直接访问成员变量
	//if (ob01.mLength == ob02.mLength && ob01.mWidth == ob02.mWidth	&& ob01.mHeight == ob02.mHeight)

	// 需要通过公共方法获取私有成员变量
	if (ob01.getLength() == ob02.getLength()
		&& ob01.getWidth() == ob02.getWidth()
		&& ob01.getHeight() == ob02.getHeight())
	{
		return true;
	}
	return false;
}

int main()
{
	// 实例化一个对象
	Cube ob01;
	ob01.CubeInit(10, 20, 30);
	ob01.setLength(100);
	ob01.setWidth(200);
	ob01.setHeight(300);

	cout << "面积:" << ob01.getArea() << ", 体积:" << ob01.getVolume() << endl;

	Cube ob02;
	ob02.CubeInit(100, 200, 300);
	cout << "全局函数比较" << endl;
	if (globalCompare(ob01, ob02))
		cout << "ob01 和 ob02 相等" << endl;
	else
		cout << "ob01 和 ob02 不相等" << endl;
	cout << "类成员函数比较" << endl;
	if (ob01.compare(ob02))
		cout << "ob01 和 ob02 相等" << endl;
	else
		cout << "ob01 和 ob02 不相等" << endl;

	return 0;
}

输出:

面积:220000, 体积:6000000
全局函数比较
ob01 和 ob02 相等
类成员函数比较
ob01 和 ob02 相等

四、成员函数在类外实现

成员函数在类内实现,会显得非常的冗重。C++支持成员函数在类中声明,类外实现;需要注意的是,类外实现成员函数一定要加作用域,否则就是一个普通的全局函数。
格式:

返回值类型 类名::成员函数(参数列表)
{
	// 函数实现
}

比如把上面实现的Persion的成员函数放到类外面:

#include <iostream>
using namespace std;
#define STR_LEN		32
class Person {
	// 类中默认私有
private:
	// 成员变量和成员函数
	char mName[STR_LEN];//不要给类成员初始化
	int mAge;

public:
	// 在类的内部声明
	void PersonInit(const char *name,int age);
	void setName(const char* name);
	char *getName();
	void setAge(int age);
	int getAge();
	void show();
	
};

// 类外部实现,需要加作用域
void Person::PersonInit(const char *name,int age)
{
	if (name == NULL)
		cout << "名字不能为空" << endl;
	else
		strncpy(mName, name, STR_LEN);
	if (age > 0 && age <= 100)
	{
		mAge = age;
	}
	else
		cout << "输入的age:" << age << "不合法" << endl;

}
// 设置mName
void Person::setName(const char* name)
{
	if (name == NULL)
		cout << "名字不能为空" << endl;
	else
		strncpy(mName, name, STR_LEN);
}
// 获取mName
char* Person::getName()
{
	return mName;
}
// 设置mAge
void Person::setAge(int age)
{
	if (age > 0 && age <= 100)
	{
		mAge = age;
	}
	else
		cout << "输入的age:" << age << "不合法" << endl;
}
// 获取mAge
int Person::getAge()
{
	return mAge;
}
// 显示mName和mAge
void Person::show()
{
	cout << "名字:" << mName << ",年龄:" << mAge << endl;
}


int main()
{
	// 实例化一个对象
	Person obj;
	obj.PersonInit("Long",20);
	obj.setName("Lion");
	obj.setAge(18);
	cout << "名字:" << obj.getName() << ",年龄:" << obj.getAge() << endl;
	
	obj.show();
	return 0;
}

五、类在其他源文件中实现

在头文件里定义类,然后在源文件里实现类的成员函数。

比如把上面实现的Persion的成员函数放到不同文件中。

Person.h

#ifndef _PERSON_H_
#define  _PERSON_H_
#include <iostream>
using namespace std;
#define STR_LEN		32
class Person {
	// 类中默认私有
private:
	// 成员变量和成员函数
	char mName[STR_LEN];//不要给类成员初始化
	int mAge;

public:
	// 在类的内部声明
	void PersonInit(const char *name,int age);
	void setName(const char* name);
	char *getName();
	void setAge(int age);
	int getAge();
	void show();
	
};

#endif

Person.cpp

#include "Person.h"

void Person::PersonInit(const char *name,int age)
{
	if (name == NULL)
		cout << "名字不能为空" << endl;
	else
		strncpy(mName, name, STR_LEN);
	if (age > 0 && age <= 100)
	{
		mAge = age;
	}
	else
		cout << "输入的age:" << age << "不合法" << endl;

}
// 设置mName
void Person::setName(const char* name)
{
	if (name == NULL)
		cout << "名字不能为空" << endl;
	else
		strncpy(mName, name, STR_LEN);
}
// 获取mName
char* Person::getName()
{
	return mName;
}
// 设置mAge
void Person::setAge(int age)
{
	if (age > 0 && age <= 100)
	{
		mAge = age;
	}
	else
		cout << "输入的age:" << age << "不合法" << endl;
}
// 获取mAge
int Person::getAge()
{
	return mAge;
}
// 显示mName和mAge
void Person::show()
{
	cout << "名字:" << mName << ",年龄:" << mAge << endl;
}

main.cpp

#include "Person.h"

int main()
{
	// 实例化一个对象
	Person obj;
	obj.PersonInit("Long",20);
	obj.setName("Lion");
	obj.setAge(18);
	cout << "名字:" << obj.getName() << ",年龄:" << obj.getAge() << endl;
	
	obj.show();
	return 0;
}

这样在使用这个类是只需要包含头文件即可。

总结

C++中,类是一种用户自定义的数据类型,它将数据和操作封装在一起。对象是该类的实例化,也就是创建了一个该类类型的变量。

类通常包括以下成员:

  1. 数据成员:用于存储对象状态信息的变量。

  2. 成员函数:用于操作数据成员和完成其他任务的函数。

  3. 构造函数:用于初始化对象的特殊函数。

  4. 析构函数:用于清理对象资源的特殊函数。

  5. 访问控制修饰符:public、private、protected,用于限制对成员的访问权限。

  6. 静态成员变量和静态成员函数:与类相关联而不是与任何单个对象相关联的成员。

使用类时,可以创建多个对象,并且每个对象都具有自己的状态和行为。通过这种方式,可以轻松管理程序中大量复杂数据结构。

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

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

相关文章

RFID工业读头工作原理和优势

RFID工业读头由天线&#xff0c;耦合元件&#xff0c;芯片&#xff0c;可对RFID标签信息进行读取和写入&#xff0c;在工业上也常作为信息的传输、处理的载体。下面我们就一起来了解一下&#xff0c;工业读头工作原理和优势是什么。 工业读头工作原理 工业RFID读头主要是通过天…

微信小程序嵌入H5页面,最简单的兼容方式web-view

//index.wxml---------------------------------------- <web-view src"{{src}}" />//index.js---------------------------------------- Page({data: {src: "https://dz.wedoyun.cn/mobile/?v20230615",},});

1.6C++双目运算符重载

C双目运算符重载 C中的双目运算符重载指的是重载二元运算符&#xff0c;即有两个操作数的运算符&#xff0c;如加减乘除运算符“”、“-”、“*”和“/”等。 通过重载双目运算符&#xff0c;可以实现自定义类型的运算符操作。 比如可以通过重载加减运算符实现自定义类型的向…

电脑误删文件恢复怎么做?数据恢复,4招就行!

我有定期清理电脑的习惯&#xff0c;一般都会将电脑里的一些垃圾文件删除&#xff0c;但在最近一次的清理中&#xff0c;我不小心把重要的文件当作垃圾文件删除了&#xff0c;请问有什么比较好的解决方法吗&#xff1f;非常感谢&#xff01; 当下电脑的使用越来越频繁&#xff…

抖音seo源码-源代码开发搭建-开源部署(不加密)

抖音SEO矩阵系统源码开发功能模型是指在抖音平台上提高视频搜索排名的一种算法模型。该功能模型包括多个部分&#xff0c;如内容优化、用户交互、社交化推广等&#xff0c;通过对这些因素的优化和提升&#xff0c;达到提高视频搜索排名的目的。具体实现包括使用关键词、标签等优…

谷粒商城p46-配置网关路由与路径重写

软件 &#xff1a; vscode idea 服务&#xff1a; renren-fast&#xff0c;gulimall-product&#xff0c;gulimall-gateway、nacos 前提条件&#xff1a; gateway、renren-fast已经注册到nacos 注意&#xff1a; 1、renren-fast单独注入nacos依赖&#xff0c;不要注入common…

CAD绘制三维图形基础

绘制三维图形的基础操作包括&#xff1a; 1、打开3d绘图窗口&#xff0c;进入3d绘图界面 2、改变绘图视角 3、改变图形的展现形式 4、绘制基本的几何图形 5、掌握对齐等修改功能 6、掌握基础布尔操作 首先是切换工作空间&#xff0c;在界面的右下角有一个类似设置的按钮…

使用VitePress创建个人网站并部署到GitHub

网站在线预览 参考文档&#xff1a; VitePress 创建 GitHub 远程仓库 克隆远程仓库到本地 git clone gitgithub.com:themusecatcher/front-end-notes.git进入 front-end-notes/ 目录&#xff0c;添加 README.md 并建立分支跟踪 echo "# front-end-notes" >>…

配置Kettle连接大数据HDFS

需求&#xff1a;配置Kettle连接大数据HDFS Kettle对接大数据平台的配置 一&#xff0e;软件环境 1.Hadoop集群,版本&#xff1a;Hadoop3.3.0 2.ETL工具Kettle&#xff0c;版本&#xff1a;pdi-ce-7.0.0.0-25 &#xff08;解压命令&#xff1a;*.zip 用 unzip 解压&#xf…

4自由度并联机器狗实现下蹲功能

1. 功能说明 本文示例将实现R328a样机4自由度并联机器狗下蹲的功能。 2. 结构说明 本样机的并联驱动结构与 【R082】4自由度并联四足 类似&#xff0c;两款样机可以对比来看。 本样机腿部的结构如下图所示&#xff1a;驱动核心部分是两个5杆结构的组合。 两个五杆结构图 驱动核…

ASP.NET MVC下的四种验证编程方式

ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表&#xff0c;但是在真正执行目标Action方法之前&#xff0c;还需要对绑定的参数实施验证以确保其有效性&#xff0c;我们将针对参数的验证成为Model绑定。总地来说&#xff0c;我们可以采用4种不同的编程模式来进行针…

手机号码篡改测试-业务安全测试实操(6)

手机号码篡改测试, 用户ID篡改测试 订单ID篡改测试-业务安全测试实操(5)_luozhonghua2000的博客-CSDN博客 手机号码篡改测试 测试原理和方法 手机号通常可以代表一个用户身份。当请求中发现有手机号参数时,我们可以试着修改它,测试是否存在越权漏洞。系统登录功能一般先判断…

计算机视觉研究院重新开启知识星球(前期我们免费加入)

点击蓝字 关注我们 关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;计算机视觉研究院 学习群&#xff5c;扫码在主页获取加入方式 计算机视觉研究院专栏 Column of Computer Vision Institute 满足广大兴趣关注者&#xff0c;最近我们平台重启了”知识星球“&…

聚观早报 |梅西将于14日淘宝开播;李斌回应蔚来全系车型降3万元

今日要闻&#xff1a;梅西将于6月14日上淘宝开播&#xff1b;李斌回应"蔚来全系车型降价3万元”&#xff1b;美国联邦贸易委员会阻止微软收购暴雪&#xff1b;称iPhone15洗系列最高涨价200美元&#xff1b;极兔正与顺丰洽谈入股 梅西将于6月14日上淘宝开播 据悉&#xff…

微服务springcloud 02 创建项目中的三个service子系统,springcloud中注册中心Eureka介绍和把三个系统注册到Eureka中

item service项目 01.使用springboot创建项目 02.选择依懒项在这里插入代码片 spring web 03.添加sp01-commons依赖 在pom.xml文件中 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" x…

「深度学习之优化算法」笔记(一):优化算法概述

优化算法笔记&#xff08;一&#xff09;优化算法的介绍 &#xff08;一&#xff09;优化算法的介绍 1.1&#xff08;what&#xff09;什么是优化算法&#xff1f; 我们常见常用的算法有排序算法,字符串遍历算法,寻路算法等。这些算法都是为了解决特定的问题而被提出。 算法本质…

基础知识学习---牛客网C++面试宝典(七)操作系统--第二节

1、本栏用来记录社招找工作过程中的内容&#xff0c;包括基础知识学习以及面试问题的记录等&#xff0c;以便于后续个人回顾学习&#xff1b; 暂时只有2023年3月份&#xff0c;第一次社招找工作的过程&#xff1b; 2、个人经历&#xff1a; 研究生期间课题是SLAM在无人机上的应…

MUR80120PT-ASEMI大电流快恢复二极管MUR80120PT

编辑&#xff1a;ll MUR80120PT-ASEMI大电流快恢复二极管MUR80120PT 型号&#xff1a;MUR80120PT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247 正向电流&#xff1a;80A 反向电压&#xff1a;1200V 引脚数量&#xff1a;3 恢复时间&#xff1a;35ns 正向压降&#…

ai绘画生成器有哪些?分享3款好用的ai自动绘画生成器

文字和绘画是两种看似不同的艺术形式&#xff0c;但它们之间却有着一种神奇的联系。你或许曾经在一些创意绘画作品中发现过使用文字进行表达的元素&#xff0c;那么&#xff0c;文本究竟如何生成这些令人惊叹的艺术作品呢&#xff1f;今天&#xff0c;我们就来探索一下文字怎样…

Vue中如何进行颜色选择与取色器?

Vue中如何进行颜色选择与取色器&#xff1f; 在Web开发中&#xff0c;颜色选择器是一个非常常见的功能。在Vue.js中&#xff0c;我们可以使用现成的颜色选择器组件或者自己编写一个颜色选择器组件。本文将介绍如何在Vue.js中实现颜色选择器组件和取色器功能。 颜色选择器组件 …