服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++深入探索类和对象之封装及class与struct的区别

C++深入探索类和对象之封装及class与struct的区别

2022-12-05 13:28对象new不出来 C/C++

C++ 类与对象涉及的知识点非常广泛,所以我准备写成几个特定的部分来作为博文分享,这次的blog将详细讲解类的属性、行为、访问权限,class与struct的区别以及具体案例,希望能够对你们有帮助,解决入门小白或者对这方面了解不

封装的意义

封装是C++三大面向对象之一

意义:

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

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

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

示例1:设计一个直角三角形,并求解他的面积

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<iostream>
using namespace std;
//class代表设计一个类,后面跟着的是类名
class taiAngle
{
public//访问权限  公共的权限
    //属性
    int m_a;//直角边a
    int m_b;//直角边b
    //行为
    //获取三角形面积
    double calculate()
    {
        return (m_a*m_b)/2;
    }
};
int main() {
 
    //通过三角形类,创建三角形的对象
    // c1就是一个具体的三角形
    taiAngle c1;
    c1.m_a = 10; //给三角形两边进行赋值操作
    c1.m_b = 10;
    cout << "三角形的面积为: " << c1.calculate() << endl;//调用方法
    system("pause");
    return 0;
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//学生类
class Student {
public:
    void setName(string name) {
        m_name = name;
    }
    void setID(int id) {
        m_id = id;
    }
    void showStudent() {
        cout << "name:" << m_name << " ID:" << m_id << endl;
    }
private:
    string m_name;
    int m_id;
};
int main() {
    Student stu;
    stu.setName("马可波罗");
    stu.setID(250);
    stu.showStudent();
    system("pause");
    return 0;
}

在第二个案例中,姓名和学号是不会被直接访问的,主函数中我们创建了stu学生类对象,但是我们输入“stu."时不会出现m_name和m_id的提示,这就牵扯到了访问权限的知识点,处于私有权限的属性只能靠成员方法加以控制,继续往下看

访问权限

public 公共权限:

成员:类内可以访问,类外可以访问

任何一种继承,子类可以访问父类的公共成员

保护权限protected

成员:类内可以访问,类外不可以访问

任何一种继承,子类可以访问父类的保护成员

私有权限private

成员:类内可以访问,类外不可以访问。

任何一种继承,子类不可以访问父类的私有成员

示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Person
{
    //姓名  公共权限
public:
    string m_Phone;
    //手机  保护权限
protected:
    string m_Phone;
    //银行卡密码  私有权限
private:
    int m_Password;
public:
    void display();
};
void Person::display()
{
    m_Name = "张三";
    m_Phone = "华为";
    m_Password = 123456;
}
int main() {
    Person p;
    p.m_Name = "李四";
    //p.m_Phone = "iPhone 13";  //保护权限类外访问不到
    //p.m_Password = 123;     //私有权限类外访问不到
    system("pause");
    return 0;
}

这个案例中定义了三种权限的属性,只有punlic:权限下的属性和成员函数可以在类外被调用;这里的display方法我在public:权限下只是声明的一下,然后在类外完成方法的实现,但是需要在原来声明的基础上加"Person::"在返回值类型和函数名之间,以表示是Person这个类作用域下的display方法;main函数只可以调用display方法和修改m_Name属性,因为只有这两个在punlic:权限下了。

class和struct的区别

在C++中 struct和class唯一的区别就在于默认的访问权限不同

class 默认权限是私有

struct 默认权限是公共

示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class C1
{
    int  m_A; //默认是私有权限
};
struct C2
{
    int m_A;  //默认是公共权限
};
int main() {
    C1 c1;
    c1.m_A = 10; //错误,访问权限是私有
    C2 c2;
    c2.m_A = 10; //正确,访问权限是公共
    system("pause");
    return 0;
}

class和struct中都定义了m_A属性,但是main函数中是无法修改类c1对象的m_A属性的

成员属性私有

优点1:将所有成员属性设置为私有,可以自己控制读写权限

优点2:对于写权限,我们可以检测数据的有效性

示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Person {
public:
    //姓名设置可读可写
    void setName(string name) {
        m_Name = name;
    }
    string getName()
    {
        return m_Name;
    }
 
    //获取年龄
    int getAge() {
        return m_Age;
    }
    //设置年龄
    void setAge(int age) {
        if (age < 0 || age > 150) {
            cout << "你个大乌龟!" << endl;
            return;
        }
        m_Age = 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;
    //年龄设置
    p.setAge(50);
    cout << "年龄: " << p.getAge() << endl;
    //爱人设置
    p.setLover("阿尼亚");
    //cout << "爱人: " << p.m_Lover << endl;  //只写属性,不可以读取
    system("pause");
    return 0;
}

当属性都设计成私有时,我们可以自己控制属性的读写权限,让程序更具有强壮性,通过写方法来读写属性,是不是很具有掌控性呢,接下来给出一个案例,加深理解。

案例练习

利用全局函数和成员方法两种方式判断两个立方体是否相等,要求利用类的知识,将属性设置为私有。

参考代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include<iostream>
using namespace std;
//案例1 判断两个立方体是否相等
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 Area(int a, int b, int c)
    {
        return 2 * (a * b + a * c + b * c);
    }
    int 体积(int a, int b, int c)
    {
        return a * b * c;
    }
    bool isSameByClass(Cube& x)
    {
        if (x.getH() == m_H && x.getL() == m_L && x.getW() == m_W)
        {
            return true;
        }
        else {
            return false;
        }
    }
private:
    int m_L;
    int m_W;
    int m_H;
};
//利用全局函数判断,两个立方体是否相等
bool isSame(Cube& c1, Cube& c2)
{
    if (c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH())
    {
        return true;
    }
    else
    {
        return false;
    }
}
int main()
{
    Cube c1;
    c1.setH(10);
    c1.setL(10);
    c1.setW(10);
    Cube c2;
    c2.setH(10);
    c2.setL(10);
    c2.setW(10);
    cout << "面积为:" << c1.Area(c1.getH(), c1.getH(), c1.getL()) << endl;
    cout << "体积为:" << c1.体积(c1.getH(), c1.getH(), c1.getL()) << endl;
    //利用成员函数判断立方体
    if (c1.isSameByClass(c2))
    {
        cout << "两个立方体相等" << endl;
    }
    else {
        cout << "两个立方体不相等" << endl;
    }
    //利用全局函数判断
    bool ret = isSame(c1, c2);
    if (ret)
    {
        cout << "两个立方体相等" << endl;
    }
    else {
        cout << "两个立方体不相等" << endl;
    }
}

这是案例的源代码,是个非常基础,能练习本篇博文内容的案例,希望大家可以理解其中的代码含义

到此这篇关于C++深入探索类和对象之封装及class与struct的区别的文章就介绍到这了,更多相关C++封装内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/m0_58618795/article/details/124774738

延伸 · 阅读

精彩推荐
  • C/C++C++双向循环列表用法实例

    C++双向循环列表用法实例

    这篇文章主要介绍了C++双向循环列表,实例分析了C++双向循环列表的创建、输出、添加、删除、移动的相关操作技巧,具有一定参考借鉴价值,需要的朋友可以...

    G05619462021-03-02
  • C/C++C语言中调用Swift函数实例详解

    C语言中调用Swift函数实例详解

    这篇文章主要介绍了C语言中调用Swift函数实例详解的相关资料,实现该功能可以通过定义全局的指向Blocks的对象指针来实现,需要的朋友可以参考下...

    zenny_chen8742021-05-25
  • C/C++C++实现简单推箱子小游戏

    C++实现简单推箱子小游戏

    这篇文章主要为大家详细介绍了C++实现简单推箱子小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    变强也变秃了10112021-09-26
  • C/C++Matlab实现简易纪念碑谷游戏的示例代码

    Matlab实现简易纪念碑谷游戏的示例代码

    《纪念碑谷》是USTWO公司开发制作的解谜类手机游戏,在游戏中,通过探索隐藏小路、发现视力错觉以及躲避神秘的乌鸦人来帮助沉默公主艾达走出纪念碑...

    slandarer10482022-10-12
  • C/C++C语言实现拼图小游戏

    C语言实现拼图小游戏

    这篇文章主要为大家详细介绍了C语言实现拼图小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    张宜强11902021-08-29
  • C/C++OpenCV实现更改图片颜色功能

    OpenCV实现更改图片颜色功能

    这篇文章主要为大家详细介绍了如何利用OpenCV实现更改图片颜色的功能,文中代码介绍详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可...

    拽拽就是我9232022-12-01
  • C/C++如何写出优美的C语言代码

    如何写出优美的C语言代码

    今天小编就为大家分享一篇关于如何写出优美的C语言代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看...

    修语讲编程12552021-07-18
  • C/C++C++数组的定义详情

    C++数组的定义详情

    这篇文章主要介绍了C++数组的定义详情,上一篇文章我们学习了类型,接下俩我们九在类型的基础上展开本篇内容数组的常用方法以及C++标准库提供的一些关...

    一个热爱学习的深度渣渣11472022-03-10