写点什么

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

作者:CtrlX
  • 2022 年 8 月 03 日
  • 本文字数:1844 字

    阅读完需:约 6 分钟

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

案例 2:点和圆的关系

回顾

封装意义一:


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


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


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


示例代码:


//圆周率const double PI = 3.14;
//1、封装的意义//将属性和行为作为一个整体,用来表现生活中的事物
//封装一个圆类,求圆的周长//class代表设计一个类,后面跟着的是类名class Circle{public: //访问权限 公共的权限
//属性 int m_r;//半径
//行为 //获取到圆的周长 double calculateZC() { //2 * pi * r //获取圆的周长 return 2 * PI * m_r; }};
int main() {
//通过圆类,创建圆的对象 // c1就是一个具体的圆 Circle c1; c1.m_r = 10; //给圆对象的半径 进行赋值操作
//2 * pi * 10 = = 62.8 cout << "圆的周长为: " << c1.calculateZC() << endl;
system("pause");
return 0;}
复制代码


封装意义二:


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


访问权限有三种:


  1. public 公共权限

  2. protected 保护权限

  3. private 私有权限

题目

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


代码解析

#include<iostream>using namespace std;
//点类class Point{private: int m_X;int m_Y;public: //设置读写权限 void setX(int x){m_X = x;} int getX(){return m_X;} void setY(int y){m_Y = y;} int getY(){return m_Y;} }//圆类class Circle{private: int m_R; Point m_Center;public: //设置读写权限,半径 void setR(int r){m_R = r;} int getR(){return m_R;} //设置圆心 void setCenter(Point center) { m_Center = center; } Point getCenter() { return m_Center; }}//判断点和园的位置关系void isInCircle(){ //计算两点间的距离的平方 int distance = (c.getCenter().getX() - p.getX() * c.getCenter().getX() - p.getX()) + (c.getCenter().getY() - p.getY() * c.getCenter().getY() - p.getY()); //计算半径平方 int rDistance = c.getR() * c.getR(); //判断 if (distance = rDistance) { cout<<"圆上"<<endl; } else if (distance > rDistance) { cout<<"圆外"<<endl; } else { cout<<"圆圆内"<<endl; } }
int main(){ }
复制代码

案例刨析

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




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

发布于: 刚刚阅读数: 7
用户头像

CtrlX

关注

Pain is inevitable,suffering is optional 2022.08.01 加入

【个人网站】ctrlx.life 【联系方式】微信:gitctrlx 【软件技能】前端,C++,Python,研究网络工程,数据结构与算法。

评论

发布
暂无评论
C++面向对象封装特性的实例分析与应用扩展(二)_c_CtrlX_InfoQ写作社区