C++面向对象封装特性的实例分析与应用扩展(二)

简介: 封装意义一: 在设计类的时候,属性和行为写在一起,表现事物语法: class 类名{ 访问权限: 属性 / 行为 };示例1:设计一个圆类,求圆的周长



案例2:点和圆的关系

回顾

封装意义一:

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

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

示例1:设计一个圆类,求圆的周长

示例代码:

//圆周率

constdoublePI=3.14;

//1、封装的意义

//将属性和行为作为一个整体,用来表现生活中的事物

//封装一个圆类,求圆的周长

//class代表设计一个类,后面跟着的是类名

classCircle

{

public:  //访问权限  公共的权限

   //属性

   intm_r;//半径

   //行为

   //获取到圆的周长

   doublecalculateZC()

   {

       //2 * pi  * r

       //获取圆的周长

       return  2*PI*m_r;

   }

};

intmain() {

   //通过圆类,创建圆的对象

   // c1就是一个具体的圆

   Circlec1;

   c1.m_r=10; //给圆对象的半径 进行赋值操作

   //2 * pi * 10 = = 62.8

   cout<<"圆的周长为: "<<c1.calculateZC() <<endl;

   system("pause");

   return0;

}

封装意义二:

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

访问权限有三种:

  1. public        公共权限  
  2. protected 保护权限
  3. private      私有权限

题目

设计一个圆形类(Circle),和一个点类(Point),计算点和圆的关系。

网络异常,图片无法展示
|

代码解析

#include

usingnamespacestd;

//点类

classPoint

{

private:

   intm_X;intm_Y;

public:

   //设置读写权限

   voidsetX(intx){m_X=x;}

   intgetX(){returnm_X;}

   

   voidsetY(inty){m_Y=y;}

   intgetY(){returnm_Y;}

}

//圆类

classCircle

{

private:

   intm_R;

   Pointm_Center;

public:

   //设置读写权限,半径

   voidsetR(intr){m_R=r;}

   intgetR(){returnm_R;}

   //设置圆心

   voidsetCenter(Pointcenter)

   {

       m_Center=center;

   }

   PointgetCenter()

   {

       returnm_Center;

   }

}

//判断点和园的位置关系

voidisInCircle()

{

   //计算两点间的距离的平方

   intdistance=

       (c.getCenter().getX() -p.getX() *c.getCenter().getX() -p.getX()) +

       (c.getCenter().getY() -p.getY() *c.getCenter().getY() -p.getY());

   //计算半径平方

   intrDistance=c.getR() *c.getR();

   //判断

   if (distance=rDistance)

   {

       cout<<"圆上"<<endl;

   }

   elseif (distance>rDistance)

   {

       cout<<"圆外"<<endl;

   }

   else

   {

       cout<<"圆圆内"<<endl;

   }

       

}

intmain()

{

   

}

案例刨析

案例原理:通过比较点与圆心的距离与半径的距离来判断点与园 的位置关系。

网络异常,图片无法展示
|

网络异常,图片无法展示
|

案例核心1:一个类可以作为另一个类的成员!

点类可以作为圆类的成员

案例核心2:可以把类拆到另外一个文件里面,头文件写声明,源文件写实现。

网络异常,图片无法展示
|

主体文件之用来存放判断点和圆的关系的函数和main函数,使程序的目的更加明确,代码更加易读。

网络异常,图片无法展示
|

分别创建点类和圆类.h的头文件用来存放类的声明,圆类和点类的.cpp源文件存放类的实现。

注意在两个文件的类里去除相应的内容!

网络异常,图片无法展示
|

注意在类的实现里要加上作用域,因为实现里不写类的声明!类的实现里需要引入头文件。

网络异常,图片无法展示
|

圆类的声明,圆类的实现。

网络异常,图片无法展示
|

注意要引入点类的头文件!

网络异常,图片无法展示
|

扩展:#pragma once

#pragma once是一个比较常用的C/C++预处理指令,只要在头文件的最开始加入这条预处理指令,就能够保证头文件只被编译一次。在C/C++中,在使用预编译指令#include的时候,为了防止重复引用造成二义性,通常有两种方式——

第一种是#ifndef指令防止代码块重复引用

第二种就是#pragma once指令,在想要保护的文件开头写入

#pragma once

#pragma once一般由编译器提供保证:同一个文件不会被包含多次。这里所说的”同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。无法对一个头文件中的一段代码作#pragma once声明,而只能针对文件。此方式不会出现宏名碰撞引发的奇怪问题,大型项目的编译速度也因此提供了一些。缺点是如果某个头文件有多份拷贝,此方法不能保证它们不被重复包含。在C/C++中,#pragma once是一个非标准但是被广泛支持的方式。

#pragma once方式产生于#ifndef之后。#ifndef方式受C/C++语言标准的支持,不受编译器的任何限制;而#pragma once方式有些编译器不支持(较老编译器不支持,如GCC 3.4版本之前不支持#pragmaonce),兼容性不够好。#ifndef可以针对一个文件中的部分代码,而#pragma once只能针对整个文件。相对而言,#ifndef更加灵活,兼容性好,#pragma once操作简单,效率高。

目录
相关文章
|
6月前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
162 15
|
5月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
159 12
|
7月前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
236 12
|
8月前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
174 5
|
8月前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
10月前
|
安全 编译器 C++
【C++11】新特性
`C++11`是2011年发布的`C++`重要版本,引入了约140个新特性和600个缺陷修复。其中,列表初始化(List Initialization)提供了一种更统一、更灵活和更安全的初始化方式,支持内置类型和满足特定条件的自定义类型。此外,`C++11`还引入了`auto`关键字用于自动类型推导,简化了复杂类型的声明,提高了代码的可读性和可维护性。`decltype`则用于根据表达式推导类型,增强了编译时类型检查的能力,特别适用于模板和泛型编程。
102 2
|
10月前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
【11月更文挑战第6天】在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
381 5
|
11月前
|
存储 并行计算 安全
C++多线程应用
【10月更文挑战第29天】C++ 中的多线程应用广泛,常见场景包括并行计算、网络编程中的并发服务器和图形用户界面(GUI)应用。通过多线程可以显著提升计算速度和响应能力。示例代码展示了如何使用 `pthread` 库创建和管理线程。注意事项包括数据同步与互斥、线程间通信和线程安全的类设计,以确保程序的正确性和稳定性。
207 5
|
7月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
3月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
80 0