C++入门-构造函数初始化列表

本文详细介绍了C++构造函数初始化列表的语法、初始化顺序、常量成员、引用成员、基类构造函数参数的使用以及注意事项,旨在提升代码效率和可读性。
摘要由CSDN通过智能技术生成

C++构造函数初始化列表

大家好啊,今天我们来聊聊在C++中的构造函数初始化列表。在C++中,构造函数初始化列表是一种特殊的语法,用于在创建对象时对成员变量进行初始化。它可以提高代码的效率和可读性,尤其在处理类中的常量成员、引用成员或基类构造函数参数时非常有用。本篇博客将介绍构造函数初始化列表的知识点,并通过例子和代码来解释每个知识点。

1. 构造函数初始化列表的基本语法

构造函数初始化列表位于构造函数的参数列表之后,使用冒号:开头,后面跟着成员变量的初始化。让我们通过一个简单的示例来说明:

#include <iostream>

class Person {
public:
    std::string name;
    int age;

    // 构造函数初始化列表的基本语法
    Person(std::string n, int a) : name(n), age(a) {
        // 在构造函数体中进行其他初始化操作
        std::cout << "构造函数被调用!" << std::endl;
    }
};

int main() {
    Person person("周杰伦", 45);
    std::cout << "Person的姓名是:" << person.name << ", 年龄是:" << person.age << std::endl;
    return 0;
}

在上面的示例中,构造函数初始化列表name(n), age(a)用于初始化Person对象的nameage成员变量。

2. 初始化顺序

构造函数初始化列表中的初始化顺序与成员变量在类中声明的顺序有关,而不是与它们在初始化列表中的顺序有关。让我们通过一个示例来演示:

#include <iostream>

class Example {
public:
    int x;
    int y;

    Example(int a, int b) : y(b), x(a) {
        std::cout << "构造函数被调用!" << std::endl;
    }
};

int main() {
    Example ex(5, 10);
    std::cout << "x的值是:" << ex.x << ", y的值是:" << ex.y << std::endl;
    return 0;
}

在上面的示例中,虽然初始化列表中先初始化了y再初始化x,但实际上x会先被初始化。

3. 常量成员的初始化

构造函数初始化列表也适用于常量成员的初始化。让我们通过一个示例来说明:

#include <iostream>

class Circle {
public:
    const double PI;
    double radius;

    // 构造函数初始化常量成员
    Circle(double r) : PI(3.14159), radius(r) {
        std::cout << "构造函数被调用!" << std::endl;
    }
};

int main() {
    Circle circle(5.0);
    std::cout << "圆的半径是:" << circle.radius << ", 圆周率是:" << circle.PI << std::endl;
    return 0;
}

在上面的示例中,常量成员PI通过构造函数初始化列表进行初始化。

4. 引用成员的初始化

构造函数初始化列表也适用于引用成员的初始化。引用成员必须在构造函数初始化列表中进行初始化,因为引用必须在创建对象时初始化为引用的对象。让我们通过一个示例来说明:

#include <iostream>

class Car {
public:
    std::string& color;

    // 构造函数初始化引用成员
    Car(std::string& c) : color(c) {
        std::cout << "构造函数被调用!" << std::endl;
    }
};

int main() {
    std::string color = "Red";
    Car car(color);
    std::cout << "Car的颜色是:" << car.color << std::endl;

    color = "Blue";
    std::cout << "Car的颜色现在是:" << car.color << std::endl;

    return 0;
}

在上面的示例中,我们通过构造函数初始化列表初始化了Car类的引用成员color

5. 基类构造函数参数的初始化

在派生类的构造函数中,可以使用构造函数初始化列表来调用基类的构造函数并传递参数。让我们通过一个示例来演示:

#include <iostream>

class Base {
public:
    int value;

    Base(int v) : value(v) {}
};

class Derived : public Base {
public:
    Derived(int v) : Base(v) {
        std::cout << "Derived构造函数被调用!" << std::endl;
    }
};

int main() {
    Derived derived(10);
    std::cout << "Derived的value是:" << derived.value << std::endl;
    return 0;
}

在上面的示例中,派生类Derived的构造函数通过构造函数初始化列表调用基类Base的构造函数并传递参数。

6. 成员对象的初始化顺序

在构造函数初始化列表中,成员对象的初始化顺序取决于它们在类中的声明顺序,而不是在初始化列表中的顺序。让我们通过一个示例来说明:

#include <iostream>

class A {
public:
    A() { std::cout << "A构造函数被调用!" << std::endl; }
};

class B {
public:
    B() { std::cout << "B构造函数被调用!" << std::endl; }
};

class C {
public:
    A a;
    B b;

    C() : b(), a() {
        std::cout << "C构造函数被调用!" << std::endl;
    }
};

int main() {
    C c;
    return 0;
}

在上面的示例中,尽管在构造函数初始化列表中先初始化了b再初始化a,但实际上a会先被初始化,因为a在类C中的声明顺序在b之前。

7. 构造函数初始化列表的注意事项

在使用构造函数初始化列表时,有一些注意事项需要考虑:

  • 所有成员对象必须在构造函数初始化列表中进行初始化,包括常量成员、引用成员和基类成员。
  • 初始化列表中的初始化顺序应该与成员对象在类中的声明顺序一致。
  • 如果派生类的构造函数没有显式调用基类构造函数,那么基类的默认构造函数会被调用。

通过以上示例,我们介绍了C++构造函数初始化列表的知识点。希望这些例子能帮助大家更好地理解构造函数初始化列表的用法和作用。感谢阅读!如果觉得对你有帮助的话,还请“一键三连”。Peace~

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值