欢迎光临
我们一直在努力

C++ 06:构造函数——对象初始化的核心指南

一、构造函数基础规则

  • 命名与返回值:函数名与类名完全一致,无返回值类型(不能写void)。

  • 自动调用:创建对象时系统自动触发,无需手动调用。

  • 默认构造:未显式定义时,编译器自动生成空默认构造(仅分配内存,成员值随机);一旦自定义构造,默认构造失效。

  • 访问权限:通常定义为public,保证外部可创建对象。

  •         基础示例

    #include <iostream>
    using namespace std;

    class Point {
    private:
    int x, y;
    public:
    // 自定义无参构造(初始化成员)
    Point() {
    x = 0;
    y = 0;
    }
    void show() {
    cout << "(" << x << "," << y << ")" << endl;
    }
    };

    int main() {
    Point p; // 自动调用无参构造
    p.show(); // 输出 (0,0)
    return 0;
    }

    二、构造函数重载与默认参数

    1. 构造函数重载

            通过参数列表不同实现重载,提供多套初始化方案:

    class Date {
    private:
    int year, month, day;
    public:
    // 无参构造
    Date() {
    year = 2024;
    month = 4;
    day = 21;
    }
    // 有参构造(重载)
    Date(int y, int m, int d) {
    year = y;
    month = m;
    day = d;
    }
    void show() {
    cout << year << "-" << month << "-" << day << endl;
    }
    };

    // 调用示例
    int main() {
    Date d1; // 无参构造:2024-4-21
    Date d2(2024, 4, 22); // 有参构造:2024-4-22
    return 0;
    }

    2. 默认参数构造

            参数列表指定默认值,兼顾 “无参” 和 “有参” 场景:

    // 全默认参数构造(替代无参+有参重载)
    class Date {
    private:
    int year, month, day;
    public:
    Date(int y=2024, int m=4, int d=21) {
    year = y;
    month = m;
    day = d;
    }
    void show() {
    cout << year << "-" << month << "-" << day << endl;
    }
    };

    // 调用示例
    int main() {
    Date d1; // 用默认值:2024-4-21
    Date d2(2024); // 部分传参:2024-4-21
    Date d3(2024,5); // 部分传参:2024-5-21
    return 0;
    }

    三、初始化列表(进阶核心)

    1. 核心优势

            初始化列表是更高效的成员初始化方式,先于函数体执行,且是const成员、引用成员的唯一初始化方式。

    2. 语法对比

    class Date {
    private:
    int year, month, day;
    const int VERSION; // const成员
    public:
    // 传统方式(函数体内赋值)
    // Date(int y, int m, int d) { year=y; month=m; day=d; }

    // 初始化列表(推荐)
    Date(int y=2024, int m=4, int d=21) : year(y), month(m), day(d), VERSION(1) {}
    void show() {
    cout << year << "-" << month << "-" << day << " v" << VERSION << endl;
    }
    };

    3. 执行规则

            成员初始化顺序由声明顺序决定,与初始化列表顺序无关。

    四、对象的 5 种定义方式

    int main() {
    Date d1; // 无参/默认参数构造
    Date d2(2024,4,22); // 直接传参
    Date d3{2024,4,23}; // C++11列表初始化(推荐,更安全)
    Date d4 = Date(2024,4,24); // 传统赋值写法
    Date* d5 = new Date(2024,4,25); // 动态创建(堆内存)

    d1.show();
    d2.show();
    d3.show();
    d4.show();
    d5->show();
    delete d5; // 释放动态对象
    return 0;
    }

    五、核心注意事项

  • 避免二义性:不要同时定义无参构造和全默认参数构造。

  • 初始化优先级:类内初始化值 < 初始化列表 < 函数体赋值(实际开发优先用初始化列表)。

  • 空指针安全:动态创建对象后需用delete释放,避免内存泄漏。

  • 赞(0)
    未经允许不得转载:171主机测评 » C++ 06:构造函数——对象初始化的核心指南
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址