C/C++ struct
C/C++ struct
自訂不同資料型態串在一起
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22struct person_t {
char *name;
unsigned age;
};
// or
// typedef struct {
// char *name;
// unsigned age;
// } person_t;
int main(void)
{
struct person_t p = { "Michelle", 37 };
// or
// struct person_t p = {
// .name = "Michelle",
// .age = 37
// };
return 0;
}- 在C語言中,定義一個結構體型別要用typedef :
1
2
3
4
5
6
7
8
9
10
11
12
13typedef struct point {
int x;
int y;
}Point;
// 在宣告變數的時候就可以:Point p1;
// 如果沒有typedef, 如:
struct point {
int x;
int y;
};
// 在宣告變數的時候就必須用:struct point p1;
// Point是struct point的別名。 - 在 C中,struct不能包含函式
- 在C++中,對struct進行了擴充套件,可以包含函式。
- 在C語言中,定義一個結構體型別要用typedef :
struct 可以內嵌在結構內的結構
- 結構內不能嵌入同一個結構,也就是結構不能遞迴宣告
儲存結構的陣列
1
2
3
4
5
6
7
8
9point_t pts[] = {
{ .x = 0.0, .y = 0.0 },
{ .x = 1.0, .y = 2.0 },
{ .x = 3.0, .y = 4.0 }
};
for (size_t i = 0; i < 3; i++) {
printf("(%.2f, %.2f)\n", pts[i].x, pts[i].y);
}存取結構指標的屬性
- 存取結構指標內的屬性有兩種方式:
- 解指標 (dereference)
- 使用 -> (箭號)
- 第二種方式在語法上比較簡潔,故較受歡迎,可以當做一種語法糖
1
2
3
4
5
6
7
8
9
10
11point_t *pt = malloc(sizeof(point_t));
if (!pt)
return 1;
/* Init x and y with dereference. */
(*pt).x = 0.0;
(*pt).y = 0.0;
/* Access fields of pt with dereference. */
assert((*pt).x == 0.0);
assert((*pt).y == 0.0);1
2
3
4
5
6
7
8
9/* Mutate x and y with `->` */
pt->x = 3.0;
pt->y = 4.0;
/* Access fields of pt with `->` */
assert(pt->x == 3.0);
assert(pt->y == 4.0);
free(pt);
- 存取結構指標內的屬性有兩種方式:
Initializing default values in a struct
- declare a variable bar with the type of foo改成
1
2
3
4
5
6struct foo {
foo() : a(true), b(true) {}
bool a;
bool b;
bool c;
} bar;1
2
3
4
5struct foo {
bool a = true;
bool b = true;
bool c;
} bar;- This was added in C++11.
- declare a variable bar with the type of foo
可以做繼承、constructor、methods
reference
c++ - Initializing default values in a struct - Stack Overflow