❤️学妹竟然问struct和class的区别❤️,我一篇文讲的明明白白!

Posted Linux猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了❤️学妹竟然问struct和class的区别❤️,我一篇文讲的明明白白!相关的知识,希望对你有一定的参考价值。


🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏:C/C++面试通关集锦(优质好文持续更新中……)🚀


绝大多数的人对 struct 和 class 都是很熟悉的,那它们之间有什么区别呢?我想很多人并没有深入的了解过这个,这篇文章就来分析一下!

首先,注意本文讨论的是 C++ 中 struct 和 class 的区别,因为 C 中 struct 和 class 的区别已经很明显了!

先说下 C++ 中 struct 相比于 C 中增加了哪些功能。

(1)struct 中可以使用 public、private、protected等属性,和 C++ 一样。

例如:

#include <iostream>
using namespace std;

struct Node {
    public:
        int x;
    private:
        int y;
    protected:
        int z;

};

int main() {
    Node obj;
    obj.x = 10;
    cout<<"obj.x = "<<obj.x<<endl;
}

编译后输出结果为:

linuxy@linuxy:~/structClass$ g++ main.cpp -o main
linuxy@linuxy:~/structClass$ ./main 
obj.x = 10
linuxy@linuxy:~/structClass$

从例子中可以看到 struct 在 C++ 中是可以添加 public、private、protected的。在纯 c 语言环境下是会出错的。

(2)struct 中可以添加方法

例如:

#include <iostream>
using namespace std;

struct Node {
    public:
        int add(int x, int y) {
            return x + y;
        }
};

int main() {
    Node obj;
    cout<<"add 10 + 20 = "<<obj.add(10, 20)<<endl;
}

编译后输出结果为:

linuxy@linuxy:~/structClass$ g++ main.cpp -o main
linuxy@linuxy:~/structClass$ ./main 
10 + 20 = 30
linuxy@linuxy:~/structClass$

(3)struct 可以继承等属性

例如:

#include <iostream>
using namespace std;

struct Parent {
    int left;
    int right;
};

struct Node : Parent{
    public:
        int x;
};

int main() {
    Node obj;
    obj.left = 10;
    cout<<"obj.left = "<<obj.left<<endl;
}

编译后输出结果为:

linuxy@linuxy:~/structClass$ g++ main.cpp -o main
linuxy@linuxy:~/structClass$ ./main 
obj.left = 10
linuxy@linuxy:~/structClass$

从上面可以看到,在C++中,struct 已经和 class 基本相同了。那为什么还要保留 struct 呢,因为 C++ 是要兼容 C的,毕竟是 c plus plus 。

那下面来具体看看 struct 和 class 有哪些不同:

(0)定义上不同

struct 是各种数据类型的组合,是一种复合数据类型,class 是一个对象的方法和属性的集合,更注重数据的安全性。

(1)默认的访问属性不同

struct 默认的访问属性是 public,class 默认的访问属性是 private

例子:

#include <iostream>
using namespace std;

struct Node {
    int x;
};

class Student {
    int y;
};

int main() {
   Node obj1;
   Student obj2;
   cout<<"obj1 x = "<<obj1.x<<endl;
   cout<<"obj2 y = "<<obj2.y<<endl;
}

编译后会出错,如下所示:

linuxy@linuxy:~/structClass$ g++ main.cpp -o main
main.cpp: In function ‘int main()’:
main.cpp:16:28: error: ‘int Student::y’ is private within this context
   16 |    cout<<"obj2 y = "<<obj2.y<<endl;
      |                            ^
main.cpp:9:9: note: declared private here
    9 |     int y;
      |         ^
linuxy@linuxy:~/structClass$

可以看到,obj1.x 的使用并没有出错,而 obj2.y 出错,显示该变量是私有的。

(2)默认的继承方式不同

struct 默认的继承方式是 public,class 默认的继承方式是 private。

#include <iostream>
using namespace std;

struct Parent1 {
    int w;
};

class Parent2 {
    int z;
};

struct Node : Parent1 {
    int x;
};

class Student : Parent2 {
    int y;
};

int main() {
   Node obj1;
   Student obj2;
   cout<<"obj1 x = "<<obj1.w<<endl;
   cout<<"obj2 y = "<<obj2.z<<endl;
}

编译后出错,如下所示:

linuxy@linuxy:~/structClass$ g++ main.cpp -o main
main.cpp: In function ‘int main()’:
main.cpp:24:28: error: ‘int Parent2::z’ is private within this context
   24 |    cout<<"obj2 y = "<<obj2.z<<endl;
      |                            ^
main.cpp:9:9: note: declared private here
    9 |     int z;
      |         ^
linuxy@linuxy:~/structClass$

可以看到,obj2.z 是私有的。

总结

在 C++ 中通常更推荐使用 class,数据安全性更高,struct 一般是作为不同类型的合集。


🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


以上是关于❤️学妹竟然问struct和class的区别❤️,我一篇文讲的明明白白!的主要内容,如果未能解决你的问题,请参考以下文章

❤️学妹面试被问bfs和dfs的区别❤️,我一文讲的明明白白!

❤️女朋友问声明和定义的区别,我这样回答!她秒懂!❤️

❤️python入门项目将学妹的照片转换为铅笔素描 ❤️

❤️python入门项目将学妹的照片转换为铅笔素描 ❤️

❤️学妹面试被问volatile❤️,我一篇文讲解的明明白白!

❤️大数据专业的学妹问我大数据怎么入门,我总结了亲身体验的学习路线推荐给她推荐收藏❤️