代碼定義
struct LinkNode {
T data;
LinkNode* link;
// 構造函數 1:默認參數 ptr=NULL
LinkNode(LinkNode* ptr = NULL) { link = ptr; }
// 構造函數 2:默認參數 ptr=NULL
LinkNode(const T& item, LinkNode* ptr = NULL) { data = item; link = ptr; }
};
調用分析
LinkNode* desptr = first = new LinkNode; // 調用構造函數 1
desptr->link = new LinkNode(value); // 調用構造函數 2
| 表達式 | 實參列表 | 匹配構造函數 | 原因 |
| `new LinkNode` | 無實參 | 構造函數 1 | 構造函數 1 參數有默認值,可零參數調用;構造函數 2 第一參數無默認值,必須提供 |
| `new LinkNode(value)` | 1個實參 (value) | 構造函數 2 | 實參類型 `T` 匹配構造函數 2 第一參數 `const T&`;構造函數 1 參數類型 `LinkNode*` 不匹配 |
關鍵規則
- 默認參數只能從右向左連續給出,中間不能跳過
- 重載決議優先精確匹配**:`new LinkNode(value)` 精確匹配構造函數 2,無需考慮默認參數
- 若定義 `LinkNode(T item = T(), LinkNode* ptr = NULL)`,則 `new LinkNode` 會調用此構造函數(模糊匹配),需顯式 `new LinkNode((LinkNode*)NULL)` 消歧
最佳實踐
// 推薦:使用不同語義的構造函數名(工廠模式)或標籤結構體
struct LinkNode {
T data;
LinkNode* next;
// 私有構造,強制使用工廠方法
LinkNode(const T& item, LinkNode* next) : data(item), next(next) {}
static LinkNode* createEmpty(LinkNode* next = nullptr) {
return new LinkNode(T(), next); // 需 T 可默認構造
}
static LinkNode* createWithValue(const T& value, LinkNode* next = nullptr) {
return new LinkNode(value, next);
}
};
// 使用
LinkNode* n1 = LinkNode::createEmpty();
LinkNode* n2 = LinkNode::createWithValue(value);
優勢:消除重載歧義、語義清晰、可擴展驗證邏輯。
- 上一篇文章: Hellocharts-android圖表縮放與視口控制:setCurrentViewport實現局部顯示
- 下一篇文章: Android項目導入Eclipse全流程:環境配置、Gradle遷移與常見錯誤排查
Copyright ©
程式碼之家 All Rights Reserved