【C/C++面试必备】struct和class的区别

举报
Linux猿 发表于 2021/08/25 21:06:42 2021/08/25
【摘要】 一文搞懂 struct 和 class 的区别!

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,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 一般是作为不同类型的合集。


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


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。