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

C++ 結構體構造函數:成員無默認構造函數時的初始化錯誤解決

     編輯:程式設計綜合問答

定義嵌套結構體 Triangle3D 包含三個 Vertex3D 成員時,若 Vertex3D 只有帶參構造函數而無默認構造函數,Triangle3D 的構造函數必須在初始化列表中顯式初始化所有成員,否則編譯報錯:must explicitly initialise member 'v2' which does not have default constructor。

錯誤代碼

struct Vertex3D {
    GLfloat x, y, z;
    Vertex3D(GLfloat a, GLfloat b, GLfloat c) : x(a), y(b), z(c) {}
    // 缺少默認構造函數 Vertex3D() {}
};

struct Triangle3D {
    Vertex3D v1, v2, v3;
    Triangle3D(Vertex3D vt1, Vertex3D vt2, Vertex3D vt3) {
        // ❌ 未在初始化列表初始化 v1/v2/v3,編譯器嘗試默認構造失敗
    }
};

解決方案一:為 Vertex3D 添加默認構造函數

struct Vertex3D {
    GLfloat x, y, z;
    Vertex3D() : x(0), y(0), z(0) {} // 添加默認構造
    Vertex3D(GLfloat a, GLfloat b, GLfloat c) : x(a), y(b), z(c) {}
};

解決方案二:Triangle3D 使用初始化列表(推薦)

struct Triangle3D {
    Vertex3D v1, v2, v3;
    Triangle3D(Vertex3D vt1, Vertex3D vt2, Vertex3D vt3)
        : v1(vt1), v2(vt2), v3(vt3) {} // 顯式調用拷貝構造
};

核心規則

  • 類/結構體若聲明了任意構造函數,編譯器不再生成默認構造函數。
  • 成員對象若無默認構造函數,包含它的類必須在初始化列表中顯式初始化該成員。
  • 初始化列表比構造函數體內賦值更高效(直接構造而非默認構造+賦值)。

養成寫初始化列表的習慣,避免此類編譯錯誤並提升性能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved