1. 程式人生 > 其它 >演示C++成員函式引數的使用

演示C++成員函式引數的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// Copyright © 2022, 飛麥 <[email protected]>, All rights reserved.

// 演示成員函式引數的使用
#include <cstdio> #include <ctime> // 簡化的日期型別(僅示例) using Datep = time_t; // 示例的任意結構 struct AnyStruct { Datep date; // 標識數值所屬日期 double value; // 外部函式需要獲該值用於計算 // 獲取數值的類函式(靜態成員函式) static double any_static_func(AnyStruct& any) { return any.value; } // 獲取數值的物件函式(動態成員函式) double
any_dynamic_func() { return value; } }; // 類函式的引用(靜態成員函式的引用) using AnyStaticFunc = double(&)(AnyStruct&); // 通過類函式引數呼叫該函式 double call_static_func(AnyStruct& node, AnyStaticFunc any_func) { return any_func(node); } // 物件函式的指標(動態成員函式的指標)【注: 動態成員函式無法定義引用】 using AnyDynamicFunc = double
(AnyStruct::*)(); // 通過物件函式引數呼叫該函式 double call_dynamic_func(AnyStruct& node, AnyDynamicFunc any_func) { return (node.*any_func)(); // 注意 node.*any_func 兩邊的括號必須要有 } // 獲取今日日期 Datep get_today() { return time(0); // 返回 1970-01-01 00:00:00 到當前時刻的秒數 } // 獲取次日日期 Datep get_next_date(Datep date) { return date + 86400; // 每天粗略計為 86400 秒, 增加這麼多秒相當於前進 1 天 } // 將日期轉換為年-月-日格式 char* ymd(Datep date) { static char str[16]; // 年-月-日佔用 10 位元組, 再加結尾的 \0 至少 11 位元組 tm mytm; // 年/月/日/時/分/秒 加其它一些屬性的複雜結構 localtime_s(&mytm, &date); // 將 time_t 轉換為 tm (本地時刻) strftime(str, sizeof(str), "%F", &mytm); // 將 tm 結構以年-月-日格式轉換為字串 return str; } // 呼叫 100 次靜態成員函式與動態成員函式 int main() { AnyStruct* arr = new AnyStruct[100]{}; // 100 個任意結構的陣列, 初始化為零 auto date = get_today(); // 獲取今日日期作為日期的初始值 auto value = 1.0; // 以 1.0 為數值的初始值 for (auto i = 0; i < 100; i++) { // 迴圈 100 次 auto ele = arr[i]; // 獲取第 i 個元素 ele.date = date; // 第 i 個元素日期域的賦值 ele.value = value; // 第 i 個元素數值域的賦值 date = get_next_date(date); // 日期向前推進 1 天(示例) value *= 1.01; // 數值放大 1%(示例) auto static_dbl = call_static_func(ele, AnyStruct::any_static_func); // 以靜態成員函式引用為引數來呼叫 auto dynamic_dbl = call_dynamic_func(ele, &AnyStruct::any_dynamic_func); // 以動態成員函式地址(&)為引數來呼叫 if (static_dbl != ele.value) // 若呼叫靜態成員函式結果有誤 throw "Fail static!"; // 提示異常資訊並退出 if (dynamic_dbl != ele.value) // 若呼叫動態成員函式結果有誤 throw "Fail dynamic!"; // 提示異常資訊並退出 printf("i=%2d, d=%s, v=%f\n", i, ymd(ele.date), ele.value); // 顯示下標、日期、數值 } }