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操作简单,效率高。

目录
相关文章
|
2月前
|
编译器 程序员 定位技术
C++ 20新特性之Concepts
在C++ 20之前,我们在编写泛型代码时,模板参数的约束往往通过复杂的SFINAE(Substitution Failure Is Not An Error)策略或繁琐的Traits类来实现。这不仅难以阅读,也非常容易出错,导致很多程序员在提及泛型编程时,总是心有余悸、脊背发凉。 在没有引入Concepts之前,我们只能依靠经验和技巧来解读编译器给出的错误信息,很容易陷入“类型迷路”。这就好比在没有GPS导航的年代,我们依靠复杂的地图和模糊的方向指示去一个陌生的地点,很容易迷路。而Concepts的引入,就像是给C++的模板系统安装了一个GPS导航仪
110 59
|
18天前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
【11月更文挑战第6天】在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
|
2月前
|
存储 算法 搜索推荐
对二叉堆的简单分析,c和c++的简单实现
这篇文章提供了对二叉堆数据结构的简单分析,并展示了如何在C和C++中实现最小堆,包括初始化、插入元素、删除最小元素和打印堆的函数,以及一个示例程序来演示这些操作。
36 19
|
2月前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
【10月更文挑战第8天】在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
|
2月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(三)
【C++】面向对象编程的三大特性:深入解析多态机制
|
2月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(二)
【C++】面向对象编程的三大特性:深入解析多态机制
|
2月前
|
编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(一)
【C++】面向对象编程的三大特性:深入解析多态机制
|
2月前
|
C++
C++ 20新特性之结构化绑定
在C++ 20出现之前,当我们需要访问一个结构体或类的多个成员时,通常使用.或->操作符。对于复杂的数据结构,这种访问方式往往会显得冗长,也难以理解。C++ 20中引入的结构化绑定允许我们直接从一个聚合类型(比如:tuple、struct、class等)中提取出多个成员,并为它们分别命名。这一特性大大简化了对复杂数据结构的访问方式,使代码更加清晰、易读。
35 0
|
4天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
18 2
|
10天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
36 5