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;
}
}``````

(. 可以叫做 的)

struct宣告常放global，但放function內也可。

# Function in struct?

## Saving Circle

### Problem: 現在有一個圓.... (座標 + 半徑)

``````struct circle{
coord pos;
double R;
};``````

## Saving Circle

### 然後算出它的面積。

``````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

### 然後算出它的面積。

``````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

### 然後算出它的面積。

``````#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

### 然後算出它的面積。

``````#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: 現在有一個二維座標，初始化(0, 0)....

``int x(1);``
``crood dot(0, 0);``

## 變數初始化

### 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;

};``````
1. constructor名字跟struct一樣。
2. 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會對應

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 : 使用預設建構子

• 預設建構子只有在沒有寫建構子才會出來。

# 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 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();``

By Arvin Liu

• 347