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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CtrlCherry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值