首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++構造函數重載與默認參數:new LinkNode與new LinkNode(value)調用規則

     編輯:程式設計綜合問答

代碼定義

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

優勢:消除重載歧義、語義清晰、可擴展驗證邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
表達式實參列表匹配構造函數原因
`new LinkNode`無實參構造函數 1構造函數 1 參數有默認值,可零參數調用;構造函數 2 第一參數無默認值,必須提供
`new LinkNode(value)`1個實參 (value)構造函數 2實參類型 `T` 匹配構造函數 2 第一參數 `const T&`;構造函數 1 參數類型 `LinkNode*` 不匹配