C++类和对象—封装(属性和行为作为整体,设计学生类,访问权限,class和struct的区别,成员属性私有化,设计案例(1立方体类,2点和圆的关系(多文件编程)))

本文详细介绍了C++中的引用,包括基本语法、函数参数传递及本质,探讨了函数的默认参数、占位参数和重载。接着讨论了类和对象的封装概念,包括属性和行为的整合、访问权限控制,以及class和struct的区别。此外,还涉及了对象的特性,如构造函数、析构函数和拷贝构造函数,以及对象模型和this指针的作用。最后提到了运算符重载和文件操作,并通过实例展示了模板和多文件编程的应用。
摘要由CSDN通过智能技术生成

C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用)

函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项)

C++类和对象—封装(属性和行为作为整体,设计学生类,访问权限,class和struct的区别,成员属性私有化,设计案例(1立方体类,2点和圆的关系(多文件编程)))

C++类和对象—对象特征(构造函数与析构函数,函数的分类以及调用,拷贝构造函数调用时机,构造函数调用规则,深拷贝和浅拷贝,初始化列表,类对象作为类成员,静态成员)

C++对象模型和this指针(成员变量和成员函数分开存储,this指针的用途,空指针访问成员函数,const修饰成员函数)

C++类和对象-友元(全局函数做友元,友元类,成员函数做友元

C++运算符重载(加号,左移,递增,赋值,关系,函数调用)

C++文件操作(文本文件,二进制文件)

C++ 模板学习01(函数模版)(函数模板的语法、函数模板注意事项、函数模板案例-数组排序、普通函数与函数模板的区别、普通函数与函数模板的调用规则、模板的局限性)

C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)

C++认为万事万物都皆为对象,对象上有其属性和行为

比如说:人可以作为对象,属性有姓名,年龄,身高,体重等等。行为有走,跑,跳,吃饭,唱歌。

车也可以作为对象,属性有轮胎,方向盘,车灯。行为有载人,放音乐,开空调等等。

具有相同性质的对象,我们可以抽象为类,人属于人类,车属于车类。

封装

一.属性和行为作为整体

封装的意义

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

  • 将属性和行为加以权限控制

封装意义一:

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

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

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

示例代码:

#include<iostream>
using namespace std;
const double PI = 3.14;

//设计一个圆类,求圆的周长
//圆求周长的公式:2 * PI * 半径

class Circle
{
    //访问权限
    //公共权限
public:
    //属性
    int m_r;//半径
    //行为
    //获取圆的周长
    double calculateZC()
    {
        return 2 * PI * m_r;
    }
  };

int main()
{
    //通过圆类   创建具体的圆(对象)
    Circle c1;
    //给圆对象 的属性进行赋值
    c1.m_r = 10;
    cout << "圆的周长为:" << c1.calculateZC() << endl;

}

增加一个设计案例

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

#include<iostream>
using namespace std;
#include<string>
//设计一个学生类型,属性有姓名和学号,可以给姓名和
//学号赋值,可以显示学生的姓名和学号
class student 
{
public:

    //属性
    string m_name;     //姓名
    int m_id;          //学号

    //行为
    //显示姓名和学号
    void showstudent()
    {
        cout << "姓名: " << m_name << "学号:" << m_id << endl;
    }

};


int main()
{
    //创建一个具体的学生  实例化对象
    student s1;
    //给s1对象 进行属性赋值操作
    s1.m_name = "张三";
    s1.m_id = 1;
    s1.showstudent();
}

但是其中对对象属性赋值还有其他方法,可以在类的行为中写函数进行调用进行赋值(主要不同见主函数中)

#include<iostream>
using namespace std;
#include<string>
//设计一个学生类型,属性有姓名和学号,可以给姓名和
//学号赋值,可以显示学生的姓名和学号
class student 
{
public:

    //属性
    string m_name;     //姓名
    int m_id;          //学号

    //行为
    //显示姓名和学号
    void showstudent()
    {
        cout << "姓名: " << m_name << "学号:" << m_id << endl;
    }
    void setname(string name)
    {
        m_name = name;
    }

    void setid(int id)
    {
        m_id = id;
    }

};
int main()
{
    //创建一个具体的学生  实例化对象
    student s1;
    //给s1对象 进行属性赋值操作
    s1.setname("张三");
    s1.setid(1);
    s1.showstudent();
}

二.访问权限

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

访问权限有三种:

  1. public 公共权限 (类内可以访问 类外可以访问)

  1. protect 保护权限 (类内可以访问 类外不可以访问)

  1. private 私有权限 (类内可以访问 类外不可以访问)

#include<iostream>
using namespace std;
#include<string>

class person
{
    //公共权限
public:
    string m_name;
    //保护权限
protected:
    string m_car;
    //私有权限
private:

    int m_password;


public:
    void func()
    {
        m_name = "张三";
        m_car = "梅赛德斯奔驰";
        m_password = 100;
    }

};


int main()
{
    
    person p;
    p.m_name = "lisi";
    /*p.m_car = "alscxa";
    p.m_password = 1000;*/
}

其中的汽车和密码都是不可以在类外访问的

C++中class和struct的区别

其实唯一的区别就是 默认的访问权限不同

区别:

  • struct默认权限为公共

  • class默认权限为私有

三.成员属性私有化

成员属性设置为私有

  1. 可以自己控制读写权限

  1. 对于写可以检测数据的有效性

#include<iostream>
using namespace std;
#include<string>

class person
{
public:
    //设置姓名
    void setname(string name)
    {
        m_name = name;
    }
    //获取姓名
    string getname()
    {
        return m_name;
    }
    //获取年龄  (年龄的范围必须是0-150)
    int getage()
    {

        m_age = 18;//初始化年龄
        return m_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;
    cout << "年龄为:" << p.getage() << endl;
    p.setlover("wei");
}

代码执行结果

程序设计中对于成员的属性都设置为私有,但是私有在界外无法直接访问,所以这个时候就需要建立公共的成员函数来提供访问的途径

代码中的setname等等都是成员函数以方便来提供可读和可写的特点。

四.设计案例

练习案例1:立方类

设计立方体(cube)

求出立方体的面积和体积

分别用全局函数和成员函数判断两个立方体是否相等

#include<iostream>
using namespace std;
#include<string>

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 calculateS()
    {
        return 2 * m_l * m_w + 2 * m_l * m_h + 2 * m_w * m_h;
    }
    //获取立方体体积
    int calculateV()
    {
        return m_l * m_w * m_h;
    }
    //利用成员函数判断两个立方体是否相等
    bool issamebyclass(cube &c)
    {
        if (getl() == c.getl() && geth() == c.geth() && getw() == c.getw())
            return true;
        return false;
    }



//属性
private:
    int m_l;//长
    int m_w;//宽
    int m_h;//高

};

//利用全局函数进行判断 两个立方体是否相等
bool issame(cube &c1,cube &c2)
{
    if (c1.getl() == c2.getl() && c1.geth() == c2.geth() && c1.getw() == c2.getw())
        return true;
        
    return false;
}

int main()
{
    cube c1;
    c1.seth(10);
    c1.setl(10);
    c1.setw(10);
    cout << "c1的面积是:" << c1.calculateS() << endl;//600
    cout << "c1的体积是:" << c1.calculateV() << endl;//1000
    
    cube c2;
    c2.seth(10);
    c2.setl(10);
    c2.setw(10);

    //利用全局函数判断
    bool ret =  issame(c1, c2);
    if (ret)
    {
        cout << "全局函数判断c1=c2" << endl;
    }
    else 
    {
        cout << "全局函数判断c1!=c2" << endl;
    }

    //利用成员函数进行判断
    ret = c1.issamebyclass(c2);
    if (ret)
    {
        cout << "成员函数进行判断c1=c2" << endl;
    }
    else
    {
        cout << "成员函数进行判断c1!=c2" << endl;
    }

}

程序执行结果

练习案例2:点和圆的关系

设计一个圆形类(circle)和一个点类(point)计算点和圆的关系

点和圆共有三种关系,点在圆内,点在圆上,点在圆外。这些都可以以点与圆心的关系来代表。

而距离可以用公式

与圆的半径进行比较。

#include<iostream>
using namespace std;
#include<string>

//点类
class point
{

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;
    }
private:
    int m_x;
    int m_y;


};

//圆类
class circle
{
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;
    }

private:
    int m_r;
    point m_center;

};

//判断点和圆之间的关系
void issamecircle(circle &c,point p)
{
    //计算两点之间的平方
    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()
{
    circle c;
    c.setr(10);
    point center;
    center.setx(10);
    center.sety(0);
    c.setcenter(center);

    point p;
    p.setx(10);
    p.sety(10);

    issamecircle(c, p);
}

测试结果

在上面代码中可以知道在类中可以让另一个类,作为本来中的成员。

点类和圆类可以使用分文件编程的方法来编写

增加两个头文件circle.h point.h

circle:

#include<iostream>
#pragma once 
using namespace std;
#include"point.h"

//圆类
class circle
{
public:
    //设置半径
    void setr(int r);

    //获取半径
    int getr();

    //设置圆心
    void setcenter(point center);

    //获取圆心
    point getcenter();


private:
    int m_r;
    point m_center;

};

point:

#pragma once
#include<iostream>
using namespace std;
class point
{

public:
    void setx(int x);
    
    int getx();
    
    void sety(int y);
    
    int gety();
    
private:
    int m_x;
    int m_y;


};

其中#pragma once是为了避免多次引用头文件,在头文件中函数只需声明即可

函数的具体实现可以写在源代码中

源代码增加两个circle.cpp point.cpp

circle.cpp:

#include"circle.h"



//圆类

//设置半径
void circle::setr(int r)
{
    m_r = r;
}
//获取半径
int circle::getr()
{
    return m_r;
}
//设置圆心
void circle::setcenter(point center)
{
    m_center = center;
}
//获取圆心
point circle::getcenter()
{
    return m_center;
}

point.cpp:

#include"point.h"

void point::setx(int x)
{
    m_x = x;
}
int point::getx()
{
    return m_x;
}
void point::sety(int y)
{
    m_y = y;
}
int point::gety()
{
    return m_y;
}

注意函数在使用的时候要声明其是成员函数

主函数的源代码:

#include<iostream>
using namespace std;
#include<string>
#include"circle.h"
#include"point.h"

//判断点和圆之间的关系
void issamecircle(circle &c,point p)
{
    //计算两点之间的平方
    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()
{
    circle c;
    c.setr(10);
    point center;
    center.setx(10);
    center.sety(0); 
    c.setcenter(center);

    point p;
    p.setx(10);
    p.sety(10);

    issamecircle(c, p);
}

各文件之间的关系

在使用分文件编写的时候只需要进行引用即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

松定

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

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

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

打赏作者

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

抵扣说明:

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

余额充值