c++中所有构造函数的介绍与使用

C++ 中,构造函数是一种特殊的成员函数,用于在创建对象时对对象进行初始化。C++ 中有多种类型的构造函数,下面详细介绍这些构造函数及其特点和使用场景。

1. 默认构造函数

  • 定义:默认构造函数是指在没有提供任何参数的情况下可以被调用的构造函数。如果类中没有显式定义任何构造函数,编译器会自动生成一个默认构造函数,这个默认构造函数不执行任何操作,只是简单地创建对象。一旦类中定义了任何构造函数,编译器就不会再自动生成默认构造函数。

  • 示例代码

    #include <iostream>

    class MyClass {
    public:
    // 显式定义的默认构造函数
    MyClass() {
    std::cout << "Default constructor called" << std::endl;
    }
    };

    int main() {
    MyClass obj; // 调用默认构造函数
    return 0;
    }

2. 带参数的构造函数

  • 定义:带参数的构造函数允许在创建对象时传递参数,以便根据这些参数对对象进行初始化。可以定义多个带不同参数列表的构造函数,实现构造函数的重载。

  • 示例代码

    #include <iostream>

    class MyClass {
    private:
    int value;
    public:
    // 带参数的构造函数
    MyClass(int val) : value(val) {
    std::cout << "Parameterized constructor called with value: " << value << std::endl;
    }
    };

    int main() {
    MyClass obj(10); // 调用带参数的构造函数
    return 0;
    }

3. 拷贝构造函数

  • 定义:拷贝构造函数是一种特殊的构造函数,用于创建一个新对象,该对象是另一个同类型对象的副本。如果类中没有显式定义拷贝构造函数,编译器会自动生成一个默认的拷贝构造函数,它会执行浅拷贝,即只复制对象的成员变量的值。

  • 示例代码

    #include <iostream>

    class MyClass {
    private:
    int value;
    public:
    MyClass(int val) : value(val) {}
    // 显式定义的拷贝构造函数
    MyClass(const MyClass& other) : value(other.value) {
    std::cout << "Copy constructor called" << std::endl;
    }
    };

    int main() {
    MyClass obj1(10);
    MyClass obj2(obj1); // 调用拷贝构造函数
    return 0;
    }

4. 移动构造函数

  • 定义:移动构造函数是 C++11 引入的新特性,用于将一个临时对象(右值)的资源所有权转移到新对象,避免不必要的深拷贝,提高性能。移动构造函数接受一个右值引用作为参数。

  • 示例代码

    #include <iostream>
    #include <utility>

    class MyClass {
    private:
    int* data;
    public:
    MyClass(int size) : data(new int[size]) {
    std::cout << "Constructor called" << std::endl;
    }
    // 移动构造函数
    MyClass(MyClass&& other) noexcept : data(other.data) {
    other.data = nullptr;
    std::cout << "Move constructor called" << std::endl;
    }
    ~MyClass() {
    delete[] data;
    }
    };

    MyClass createObject() {
    return MyClass(10);
    }

    int main() {
    MyClass obj = createObject(); // 调用移动构造函数
    return 0;
    }

5. 委托构造函数

  • 定义:委托构造函数允许一个构造函数调用同一个类的其他构造函数,以减少代码重复。在委托构造函数中,使用初始化列表调用其他构造函数。

  • 示例代码

    #include <iostream>

    class MyClass {
    private:
    int value;
    double dValue;
    public:
    // 主构造函数
    MyClass(int val, double dVal) : value(val), dValue(dVal) {
    std::cout << "Main constructor called" << std::endl;
    }
    // 委托构造函数
    MyClass(int val) : MyClass(val, 0.0) {
    std::cout << "Delegating constructor called" << std::endl;
    }
    };

    int main() {
    MyClass obj(10); // 先调用主构造函数,再调用委托构造函数
    return 0;
    }

6. 转换构造函数

  • 定义 :转换构造函数是一种可以将其他类型的对象转换为当前类对象的构造函数。通常,它只接受一个参数。可以使用 explicit 关键字来禁止隐式类型转换。

  • 示例代码

    #include <iostream>

    class MyClass {
    private:
    int value;
    public:
    // 转换构造函数
    MyClass(int val) : value(val) {
    std::cout << "Conversion constructor called" << std::endl;
    }
    };

    void func(MyClass obj) {
    std::cout << "Function called" << std::endl;
    }

    int main() {
    func(10); // 调用转换构造函数进行隐式类型转换
    return 0;
    }

如果将转换构造函数声明为 explicit,则必须显式地进行类型转换,例如 func(MyClass(10));

相关推荐
(>_<)2 小时前
java minio 分片上传工具类与测试demo
java·minio·分片上传
不想打工的码农2 小时前
MyBatis-Plus多数据源实战:被DBA追着改配置后,我肝出这份避坑指南(附动态切换源码)
java·后端
无小道2 小时前
QT——QFIie和QFileInfo文件类
开发语言·qt·命令模式
Dovis(誓平步青云)2 小时前
《滑动窗口算法:从 “暴力遍历” 到 “线性高效” 的思维跃迁》
运维·服务器·数据库·算法
Coder_Boy_2 小时前
Deeplearning4j+ Spring Boot 电商用户复购预测案例
java·人工智能·spring boot·后端·spring
踢足球09292 小时前
寒假打卡:2026-2-7
java·开发语言·javascript
闻哥2 小时前
Kafka高吞吐量核心揭秘:四大技术架构深度解析
java·jvm·面试·kafka·rabbitmq·springboot
金牌归来发现妻女流落街头2 小时前
【Springboot基础开发】
java·spring boot·后端
_OP_CHEN2 小时前
【算法基础篇】(五十七)线性代数之矩阵乘法从入门到实战:手撕模板 + 真题详解
线性代数·算法·矩阵·蓝桥杯·c/c++·矩阵乘法·acm/icpc
天天爱吃肉82182 小时前
【跨界封神|周杰伦×王传福(陶晶莹主持):音乐创作与新能源NVH测试,底层逻辑竟完全同源!(新人必看入行指南)】
python·嵌入式硬件·算法·汽车