🎈 作者: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 一般是作為不同型別的合集,
🎈 歡迎小伙伴們點贊👍、收藏?、留言💬
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/290205.html
標籤:其他
上一篇:學會這個演算法,告別地毯式搜索,開啟你的大神成長之路
下一篇:申請https證書相關說明
