struct
Arvin Liu
Intro
Basic Idea - New Type
Problem: 現在有一個整數....
int x;
Problem: 現在有一個三維座標....
int x, y, z;
?
變數一多會很不好管理。
可不可以寫成一個 ?
coordinate: 座標
crood3d dot;
Problem
Saving Coordinates
Problem: 現在有n個三維座標....
int x[100], y[100], z[100];
cin >> n;
for(int i=0; i<n; i++){
cin >> x[i];
cin >> y[i];
cin >> z[i];
}
從前,你會這樣寫。
Saving Coordinates
Problem: 現在有n個三維座標....
int x[100], y[100], z[100];
cin >> n;
for(int i=0; i<n; i++){
cin >> x[i];
cin >> y[i];
cin >> z[i];
}
從前,你會這樣寫。
struct coord{
int x, y, z;
};
// ....
coord dot[100];
cin >> n;
for(int i=0; i<n; i++){
cin >> dot[i].x;
cin >> dot[i].y;
cin >> dot[i].z;
}
現在,你可以這樣寫。
相關的變數散落一地。
相關的變數捆在一起。
Saving Coordinates
Problem: 現在有n個三維座標....
#include <iostream>
using namespace std;
struct coord{
int x, y, z;
};
int main(){
int n;
coord dot[100];
cin >> n;
for(int i=0; i<n; i++){
cin >> dot[i].x;
cin >> dot[i].y;
cin >> dot[i].z;
}
}
創造一個新的形態: crood,包含著三個整數,xyz。
記得要加分號。
宣告: 把它當正常的型態就可以了。 就像int一樣宣告。
使用: (變數).(裡面的成員)。
(. 可以叫做 的)
struct宣告常放global,但放function內也可。
一個完整的範例。
Function in struct?
Saving Circle
Problem: 現在有一個圓.... (座標 + 半徑)
沒錯,struct裡面可以再包一個struct!
struct circle{
coord pos;
double R;
};
Saving Circle
Problem: 現在有一個圓.... (座標 + 半徑)
然後算出它的面積。
struct circle{
coord pos;
double R;
};
struct circle{
coord pos;
double R;
};
double area(circle C){
double pi = 3.1415926;
return C.R * C.R * pi;
}
相關的變數 函數散落一地。
Saving Circle
Problem: 現在有一個圓.... (座標 + 半徑)
然後算出它的面積。
從前(?) 你是這樣寫。
struct circle{
coord pos;
double R;
};
double area(circle C){
double pi = 3.1415926;
return C.R * C.R * pi;
}
struct circle{
double pi = 3.1415926;
coord pos;
double R;
double area(){
return R * R * pi;
}
};
同理,函式也可以放進去。
就不用指定是哪個圓了。
Saving Circle
Problem: 現在有一個圓.... (座標 + 半徑)
然後算出它的面積。
#include <iostream>
using namespace std;
struct coord{
int x, y;
};
struct circle{
double pi = 3.1415926;
coord pos;
double R;
double area(){
return R * R * pi;
}
};
int main(){
circle C;
C.pos.x = 0, C.pos.y = 1, C.R = 1.2;
cout << C.pos.x << " " << C.pos.y << endl;
cout << C.R << endl;
cout << C.area() << endl;
}
Constructor
Saving Circle
Problem: 現在有一個圓.... (座標 + 半徑)
然後算出它的面積。
#include <iostream>
using namespace std;
struct coord{
int x, y;
};
struct circle{
double pi = 3.1415926;
coord pos;
double R;
double area(){
return R * R * pi;
}
};
int main(){
circle C;
C.pos.x = 0, C.pos.y = 1, C.R = 1.2;
cout << C.pos.x << " " << C.pos.y << endl;
cout << C.R << endl;
cout << C.area() << endl;
}
幹什麼東西?
變數初始化
Problem: 現在有一個整數,初始化1....
int x=1;
Problem: 現在有一個二維座標,初始化(0, 0)....
crood dot;
dot.x = dot.y = 0;
int x(1);
crood dot(0, 0);
?
變數初始化1
Problem: 現在有一個整數,初始化1....
Problem: 現在有一個二維座標,初始化(0, 0)....
int x(1);
crood dot(0, 0);
還有誰會用小括號?
函式 -> 所以你要寫一個初始化函式
a.k.a. constructor 建構子
變數初始化
Problem: 現在有一個二維座標,初始化(0, 0)....
crood dot(0, 0);
函式 -> 所以你要寫一個初始化函式
a.k.a. constructor 建構子
struct coord{
int x, y;
coord(int a, int b){
x = a, y = b;
}
};
struct coord{
int x, y;
};
- constructor名字跟struct一樣。
- constructor不需要回傳型態。
變數初始化2
Problem: 現在有一個二維座標,預設初始化(0, 0)....
crood dot;
希望光是這樣dot就可以
dot.x = dot.y = 0;
struct coord{
int x, y;
coord(){
x = 0, y = 0;
}
};
變數初始化 1 + 2
Problem: 現在有一個二維座標,預設初始化(0, 0),並支援給兩個數字就初始化。....
struct coord{
int x, y;
coord(){
x = 0, y = 0;
}
};
struct coord{
int x, y;
coord(int a, int b){
x = a, y = b;
}
};
struct coord{
int x, y;
coord(){
x = 0, y = 0;
}
coord(int a, int b){
x = a, y = b;
}
};
變數初始化 - code
Problem: 現在有一個二維座標,預設初始化(0, 0),並支援給兩個數字就初始化。....
#include <iostream>
using namespace std;
struct coord{
int x, y;
coord(){
x=0, y=0;
}
coord(int a, int b){
x=a, y=b;
}
void print(){
printf("(%d, %d)\n", x, y);
}
};
int main(){
coord A;
coord B(1, 2);
A.print();
B.print();
}
# Output:
(0, 0)
(1, 2)
Default Constructor
Default Constructor
struct coord{
int x, y;
coord(){
x=0, y=0;
}
coord(int a, int b){
x=a, y=b;
}
};
int main(){
coord A;
}
int main(){
coord A;
}
struct coord{
int x, y;
// 沒有任何建構子的時候,
// 程式會自己建立預設建構子。
// coord(){}
};
coord A會對應
到coord()的建構子。
沒建構子給coord A對應?
struct沒有建構子,
程式就會自己加預設建構子。
預設建構子沒有參數也不會做事。
struct coord {
int x, y;
coord (int _x, int _y){
x = _x, y = _y;
}
};
struct crood {
int x, y;
coord (){x = y = 0;}
coord (int _x, int _y) {
x = _x, y = _y;
}
};
coord c;
宣告
使用
coord c;
struct coord {
int x, y;
};
coord c;
error: no matching function for call to ‘coord::coord()’
OK : 符合其中一個自己寫的建構子
OK : 使用預設建構子
- 預設建構子只有在沒有寫建構子才會出來。
Default Constructor
Common Mistakes
常見錯誤
- 記得要加分號。
- 建構子不需要type,也不需要回傳值(return)。
- 函式參數名稱(包括建構子)和成員名稱相撞?
struct coord {
int x, y;
coord (int x, int y) {
x = x, y = y;
}
};
struct coord {
int x, y;
coord (int _x, int _y) {
x = _x, y = _y;
}
};
struct coord {
int x, y;
coord (int x, int y) {
this -> x = x;
this -> y = y;
}
};
this -> 的用法 2!可能會教(?)
Review
啥時要寫struct?
- 方便管理變數。
- 你會很清楚的知道那些變數是屬於那些類別。
假設一個怪獸有血量,位置,屬性,你可以直接用monster.hp / monster.position 比較不會搞混。
- 你會很清楚的知道那些變數是屬於那些類別。
- 使用constructor建構子可以快速初始化。
- 增加程式的可讀性。
- 這樣Debug也會更加容易:)。
如何寫一個struct?
- 定義型態 - 座標struct
- struct的成員
- struct的建構子
- 沒參數
- 都初始化為0。
- 兩個參數
- 直接放進去。
- 沒參數
- 一個函數 f
- struct的成員
struct coord {
int x;
int y;
coord () {
x = y = 0;
}
coord (int _x, int _y) {
x = _x;
y = _y;
}
int f () {
return x * y ;
}
};
int x;
int y;
return x*y;
如何用一個struct?
- 宣告座標c,初始化(0, 0)
-
宣告座標c,初始化(2, 3)
- 印出座標c的x軸資訊
- 印出座標c的
struct coord {
int x;
int y;
coord () {
x = y = 0;
}
coord (int _x, int _y) {
x = _x;
y = _y;
}
int f () {
return x * y ;
}
};
coord c;
xy
coord c();
coord c(2, 3);
cout << c.x;
cout << c.f();
struct
By Arvin Liu
struct
- 788