C++深入探索类和对象之封装及class与struct的区别

目录
  • 封装的意义
  • 访问权限
  • class和struct的区别
  • 成员属性私有
  • 案例练习

封装的意义

封装是C++三大面向对象之一

意义:

1、设计类的时候,属性和行为写在一起,表现事物

2、类在设计时,可以把属性和行为放在不同的权限下,加以控制

语法:class 类名 {访问权限:属性 / 行为};

示例1:设计一个直角三角形,并求解他的面积

#include<iostream>
using namespace std;
//class代表设计一个类,后面跟着的是类名
class taiAngle
{
public:  //访问权限  公共的权限
	//属性
    int m_a;//直角边a
    int m_b;//直角边b
	//行为
	//获取三角形面积
	double calculate()
	{
		return (m_a*m_b)/2;
	}
};
int main() {

	//通过三角形类,创建三角形的对象
	// c1就是一个具体的三角形
	taiAngle c1;
	c1.m_a = 10; //给三角形两边进行赋值操作
    c1.m_b = 10;
	cout << "三角形的面积为: " << c1.calculate() << endl;//调用方法
	system("pause");
	return 0;
}

示例2:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,显示学生的姓名和学号

//学生类
class Student {
public:
	void setName(string name) {
		m_name = name;
	}
	void setID(int id) {
		m_id = id;
	}
	void showStudent() {
		cout << "name:" << m_name << " ID:" << m_id << endl;
	}
private:
	string m_name;
	int m_id;
};
int main() {
	Student stu;
	stu.setName("马可波罗");
	stu.setID(250);
	stu.showStudent();
	system("pause");
	return 0;
}
 

在第二个案例中,姓名和学号是不会被直接访问的,主函数中我们创建了stu学生类对象,但是我们输入“stu."时不会出现m_name和m_id的提示,这就牵扯到了访问权限的知识点,处于私有权限的属性只能靠成员方法加以控制,继续往下看

访问权限

public 公共权限:

成员:类内可以访问,类外可以访问

任何一种继承,子类可以访问父类的公共成员

保护权限protected

成员:类内可以访问,类外不可以访问

任何一种继承,子类可以访问父类的保护成员

私有权限private

成员:类内可以访问,类外不可以访问。

任何一种继承,子类不可以访问父类的私有成员

示例:

class Person
{
	//姓名  公共权限
public:
	string m_Phone;
	//手机  保护权限
protected:
	string m_Phone;
	//银行卡密码  私有权限
private:
	int m_Password;
public:
	void display();
};
void Person::display()
{
	m_Name = "张三";
	m_Phone = "华为";
	m_Password = 123456;
}
int main() {
	Person p;
	p.m_Name = "李四";
	//p.m_Phone = "iPhone 13";  //保护权限类外访问不到
	//p.m_Password = 123;     //私有权限类外访问不到
	system("pause");
	return 0;
}

这个案例中定义了三种权限的属性,只有punlic:权限下的属性和成员函数可以在类外被调用;这里的display方法我在public:权限下只是声明的一下,然后在类外完成方法的实现,但是需要在原来声明的基础上加"Person::"在返回值类型和函数名之间,以表示是Person这个类作用域下的display方法;main函数只可以调用display方法和修改m_Name属性,因为只有这两个在punlic:权限下了。

class和struct的区别

在C++中 struct和class唯一的区别就在于默认的访问权限不同

class 默认权限是私有

struct 默认权限是公共

示例:

class C1
{
	int  m_A; //默认是私有权限
};
struct C2
{
	int m_A;  //默认是公共权限
};
int main() {
	C1 c1;
	c1.m_A = 10; //错误,访问权限是私有
	C2 c2;
	c2.m_A = 10; //正确,访问权限是公共
	system("pause");
	return 0;
}

class和struct中都定义了m_A属性,但是main函数中是无法修改类c1对象的m_A属性的

成员属性私有

优点1:将所有成员属性设置为私有,可以自己控制读写权限

优点2:对于写权限,我们可以检测数据的有效性

示例:

class Person {
public:
	//姓名设置可读可写
	void setName(string name) {
		m_Name = name;
	}
	string getName()
	{
		return m_Name;
	}

	//获取年龄
	int getAge() {
		return m_Age;
	}
	//设置年龄
	void setAge(int age) {
		if (age < 0 || age > 150) {
			cout << "你个大乌龟!" << endl;
			return;
		}
		m_Age = age;
	}
	//情侣设置为只写
	void setLover(string lover) {
		m_Lover = lover;
	}
private:
	string m_Name; //可读可写  姓名
	int m_Age; //只读  年龄
	string m_Lover; //只写  爱人
};
int main()
{
	Person p;
	//姓名设置
	p.setName("张三");
	cout << "姓名: " << p.getName() << endl;
	//年龄设置
	p.setAge(50);
	cout << "年龄: " << p.getAge() << endl;
	//爱人设置
	p.setLover("阿尼亚");
	//cout << "爱人: " << p.m_Lover << endl;  //只写属性,不可以读取
	system("pause");
	return 0;
}

当属性都设计成私有时,我们可以自己控制属性的读写权限,让程序更具有强壮性,通过写方法来读写属性,是不是很具有掌控性呢,接下来给出一个案例,加深理解。

案例练习

利用全局函数和成员方法两种方式判断两个立方体是否相等,要求利用类的知识,将属性设置为私有。

参考代码:

#include<iostream>
using namespace std;
//案例1 判断两个立方体是否相等
class Cube
{
public:
	void setL(int l)
	{
		m_L = l;
	}
	int getL()
	{
		return m_L;
	}
	void setW(int w)
	{
		m_W = w;
	}
	int getW()
	{
		return m_W;
	}
	void setH(int h)
	{
		m_H = h;
	}
	int getH()
	{
		return m_H;
	}
	int Area(int a, int b, int c)
	{
		return 2 * (a * b + a * c + b * c);
	}
	int 体积(int a, int b, int c)
	{
		return a * b * c;
	}
	bool isSameByClass(Cube& x)
	{
		if (x.getH() == m_H && x.getL() == m_L && x.getW() == m_W)
		{
			return true;
		}
		else {
			return false;
		}
	}
private:
	int m_L;
	int m_W;
	int m_H;
};
//利用全局函数判断,两个立方体是否相等
bool isSame(Cube& c1, Cube& c2)
{
	if (c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH())
	{
		return true;
	}
	else
	{
		return false;
	}
}
int main()
{
	Cube c1;
	c1.setH(10);
	c1.setL(10);
	c1.setW(10);
	Cube c2;
	c2.setH(10);
	c2.setL(10);
	c2.setW(10);
	cout << "面积为:" << c1.Area(c1.getH(), c1.getH(), c1.getL()) << endl;
	cout << "体积为:" << c1.体积(c1.getH(), c1.getH(), c1.getL()) << endl;
	//利用成员函数判断立方体
	if (c1.isSameByClass(c2))
	{
		cout << "两个立方体相等" << endl;
	}
	else {
		cout << "两个立方体不相等" << endl;
	}
	//利用全局函数判断
	bool ret = isSame(c1, c2);
	if (ret)
	{
		cout << "两个立方体相等" << endl;
	}
	else {
		cout << "两个立方体不相等" << endl;
	}
}

这是案例的源代码,是个非常基础,能练习本篇博文内容的案例,希望大家可以理解其中的代码含义

到此这篇关于C++深入探索类和对象之封装及class与struct的区别的文章就介绍到这了,更多相关C++封装内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++深入讲解类与对象之OOP面向对象编程与封装

    目录 1.面向对象编程 2.面向过程性编程和面向对象编程 3.类的引入 4.类的定义 4.1类的两种定义方式 4.1.1声明和定义全部放在类体中 4.2.2.声明和定义不放在类体中 5.类的访问限定符及封装 5.1 访问限定符 5.2封装 6.类的作用域 7.类的实例化 8.类对象模型 如何计算类对象的大小 面向过程编程也叫结构化编程.虽然结构化编程的理念提高了程序的清晰度,可靠性,并且方便维护.但它再编写大型的程序时,仍然面临这巨大的挑战,OOP(面向对象编程)提供了一种新的方法.与强调算法的

  • C++学习笔记之类与对象详解

    目录 前言: 1.访问限定符: [问题]C++中 struct和class的区别是什么? 2.封装 [问题]在类和对象的阶段,我们只研究类的封装特性,那什么是封装呢? 3.类的定义与声明 [问题]函数调用的问题 4.类的作用域 5.类的实例化 6.类的分类 总结 前言: 1.C 语言是面向过程的,关注的是过程,分析出求解的步骤,通过函数逐步调用解决问题. 2.C++是基于面向对象的,关注的是对象,蒋一件事情拆分成不同的对象,靠对象之间的交互完成. 举个例子:外卖系统 面向过程是下单.接单.送餐的

  • C++中的类与对象深度解析

    目录 初始化列表 引论 初始化列表 explicit关键字 引论 explicit关键字使用 static成员 友元 引论 友元 内部类 基础概念 内部类的使用 补充 析构顺序例题 总结 初始化列表 引论 //初始化列表的引出 class B { public: B() { cout << "我是B的构造函数" << endl; } private: int _b; }; class A { public: A() { cout << "我

  • C++类与对象的详细说明

    目录 类的引入 类的定义 1.声明和定义全部放在类体中 2.声明放在头文件,定义放在源文件中 类的访问限定符号及封装 访问限定符 封装 类的实例化 类对象模型 this指针 this指针的特性 总结 类的引入 在引入类之前,先来回忆一下C语言中的结构体.结构体是一种自定义类型,可以在其中定义变量,如我们所熟悉的日期结构体: struct Date { int year; int month; int day; }; 而在C++中,结构体被升级成了类,结构体中不仅可以定义成员变量,也可以定义成员函

  • C++初阶教程之类和对象

    目录 类和对象<上> 1. 类的定义 2. 类的封装 2.1 访问限定修饰符 2.2 类的封装 3. 类的使用 3.1 类的作用域 3.2 类的实例化 4. 类对象的存储 5. this 指针 5.1 this 指针的定义 5.2 this 指针的特性 类和对象<中> 1. 构造函数 1.2 构造函数的定义 2.2 构造函数的特性 2. 析构函数 2.1 析构函数的定义 3. 拷贝构函数 3.1 拷贝构造函数的定义 3.2 拷贝构造函数的特性 4. 运算符重载 4.1 运算符重载的

  • C++类和对象深入探索之分文件编写点和圆的关系详解

    目录 创建圆心类 创建圆类 判断点圆关系函数 最终实现 总结 上一篇封装直达 创建圆心类 point.h #pragma once #include<iostream> using namespace std; //创建圆心类 class Point { public: void setM_x(int x); int getM_x(); void setM_y(int y); int getM_y(); private: int m_x; int m_y; }; 把圆心的横纵坐标设为私有,公共

  • C++深入探究类与对象之对象模型与this指针使用方法

    目录 C++对象模型和this指针 1 成员变量和成员函数分开存储 2 this指针概念 3 空指针访问成员函数 4 const修饰成员函数 C++面向对象的三大特性为:封装.继承.多态 C++认为万事万物都皆为对象,对象上有其属性和行为 例如: ​ 人可以作为对象,属性有姓名.年龄.身高.体重…,行为有走.跑.跳.吃饭.唱歌… ​ 车也可以作为对象,属性有轮胎.方向盘.车灯…,行为有载人.放音乐.放空调… ​ 具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类 C++对象模型和th

  • C++深入探究类与对象之友元与运算符重载

    目录 友元 1 全局函数做友元 2 类做友元 3 成员函数做友元 运算符重载 1 加号运算符重载 2 左移运算符重载 3 递增运算符重载 4 赋值运算符重载 5 关系运算符重载 6 函数调用运算符重载 友元 生活中你的家有客厅(Public),有你的卧室(Private),客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去,但是呢,你也可以允许你的好闺蜜好基友进去. 在程序里,有些私有属性也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术. 友元的目的就是让一个函数

  • C++深入探索类和对象之封装及class与struct的区别

    目录 封装的意义 访问权限 class和struct的区别 成员属性私有 案例练习 封装的意义 封装是C++三大面向对象之一 意义: 1.设计类的时候,属性和行为写在一起,表现事物 2.类在设计时,可以把属性和行为放在不同的权限下,加以控制 语法:class 类名 {访问权限:属性 / 行为}: 示例1:设计一个直角三角形,并求解他的面积 #include<iostream> using namespace std; //class代表设计一个类,后面跟着的是类名 class taiAngle

  • C++类和对象之封装详解

    目录 封装的意义以及示例 访问权限 公共权限 public 保护权限 protected 私有权限 private struct 和 class的区别 成员属性私有化 案例1:设计立方体类 案例2:点和圆的关系 总结 封装的意义以及示例 封装是C++面向对象三大特征之一 封装的意义: 将属性和行为作为一个整体,表现生活中的事物将属性和行为加以权限控制 语法:class 类名{  访问权限 : 属性  /  行为 }: 类的对象的公共数据成员可以使用直接成员访问运算符 . 来访问. 示例1: 设计

  • Swift类和对象的底层探索分析

    目录 引言 1. 对象 1.1 上层代码中查找 1.1.1 查找对象调用方法 1.1.2 设置符号断点 1.2 swift_allocObject 1.3 swift_showAlloc 1.4 查看HeapObject结构体 1.5 对象内存大小计算 1.6 总结 2. 类 2.1 查找HeapMetadata 2.2. TargetHeapMetaData 2.3. TargetMetaData 2.4. TargetClassMetadata 2.5. TargetAnyClassMeta

  • 新手了解java 类,对象以及封装基础知识

    目录 1.类 2.对象 3.方法的重载 什么是方法的重载 4.构造器 什么是构造方法 构造方法语法: 构造方法特点 5.this this指代当前对象,即哪个对象调用就指代哪个对象 6.封装 封装的作用 怎么封装 步骤 总结 1.类 什么是类 ​ 类是具备某些共同特征的实体的集合,是对所具有相同特征实体的抽象. Java中定义类的基本语法 访问修饰符 class 类名{} public class Student{ //定义了一个学生类 } 成员变量 成员变量就是对象所拥有的属性 基本语法 访问

  • Javascript学习笔记5 类和对象

    面向对象语言三大特点:继承,多态,封装,这三点虽然Javascript没有提供天然的语法实现,但是我们都可以通过prototype等技巧来实现,因此这种说法似乎不过分. 在Javascript中,构造对象有三种方式: 1. 首先,我们要明确一个概念,Javascript是一种弱类型的语言,一方面体现在Javascript的变量,返回类型都是没有强类型约束的,另一方面,Javascript可以为对象任意添加属性和方法.根据这个,我们可以写出这样的代码: 复制代码 代码如下: <script typ

  • Javascript创建类和对象详解

    现总结一下Javascript创建类和对象的几种方法: 1.原始的创建方法: <script type="text/javascript"> var person = new Object(); person.name="Amy"; person.sex="Woman"; person.show=function(){ document.write("name is: "+this.name+" ; se

  • Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解

    本文实例讲述了Zend Framework教程之响应对象的封装Zend_Controller_Response用法.分享给大家供大家参考,具体如下: 概述 响应对象逻辑上是请求对象的搭档.目的在于收集消息体和/或消息头,因而可能返回大批的结果. Zend_Controller_Response响应对象的基本实现 ├── Response │   ├── Abstract.php │   ├── Cli.php │   ├── Exception.php │   ├── Http.php │  

  • 全面理解Java类和对象

    面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分.在面向对象程序设计(OOP)中,不必关心对象的具体实现.在传统的结构化程序设计中,算法是第一位的,数据结构是第二位的,即首先确定如何操作数,再考虑如何组织数据,以方便操作.而OOP则颠倒了这种次序,将数据放在第一位,然后再考虑操作数据的算法. 一.类 类是构造对象的模板和蓝图.通俗地说,类相当于建筑的图纸,而对象相当于建筑物.由类构造对象的过程称为创建对象的实例. Java中通过关键字class定义"类"

随机推荐