C++中的6种构造函数举例详解

 更新时间:2024年10月02日 10:07:51   作者:雨伞菌  
这篇文章主要介绍了C++中的6种构造函数的相关资料,C++中构造函数用于类对象初始化,类型包括默认构造函数、参数化构造函数、拷贝构造函数等,默认构造函数通常不需要参数,编译器会自动生成,除非存在其他构造函数,需要的朋友可以参考下

在 C++ 中,构造函数是一种特殊的成员函数,用于初始化类对象。在对象创建时自动调用,构造函数的主要作用是分配资源、初始化数据成员等。根据不同的功能和使用场景,C++ 提供了多种类型的构造函数:

1. 默认构造函数 (Default Constructor)

默认构造函数不接受任何参数,或者所有参数都有默认值。当你创建对象时如果不指定参数,就会调用默认构造函数。

特点

  • 如果类没有定义任何构造函数,编译器会自动生成一个默认构造函数。
  • 如果类有其他构造函数但没有显式定义默认构造函数,编译器不会生成默认构造函数。

示例

class MyClass {
public:
    MyClass() { // 默认构造函数
        x = 0;
    }
private:
    int x;
};

MyClass obj; // 自动调用默认构造函数

2. 参数化构造函数 (Parameterized Constructor)

参数化构造函数允许在创建对象时传递参数,用于初始化对象的成员变量。

特点

  • 通过传递参数,可以灵活地为对象赋值。

示例

class MyClass {
public:
    MyClass(int val) { // 参数化构造函数
        x = val;
    }
private:
    int x;
};

MyClass obj(10); // 使用参数化构造函数

3. 拷贝构造函数 (Copy Constructor)

拷贝构造函数用于创建对象时,用一个已存在的对象来初始化新对象。其形式为接受一个对象的常量引用。

特点

  • 如果没有显式定义,编译器会自动生成一个默认的拷贝构造函数。
  • 主要用于复制对象的值,特别是对于动态分配内存的类,手动定义拷贝构造函数可以防止浅拷贝问题。

示例

class MyClass {
public:
    MyClass(int val) : x(val) {} // 参数化构造函数
    MyClass(const MyClass &obj) { // 拷贝构造函数
        x = obj.x;
    }
private:
    int x;
};

MyClass obj1(10);
MyClass obj2 = obj1; // 使用拷贝构造函数

4. 移动构造函数 (Move Constructor)

移动构造函数是在 C++11 引入的,用于通过"移动语义"来避免拷贝操作,从而提高程序的性能,特别是涉及动态分配资源的对象。

特点

  • 接受一个右值引用 (T&&)。
  • 用于将资源从一个临时对象“移动”到新的对象中,通常通过偷取资源而不是复制它们。

示例

class MyClass {
public:
    MyClass(int val) : x(new int(val)) {} // 动态分配内存
    MyClass(MyClass&& obj) noexcept { // 移动构造函数
        x = obj.x;
        obj.x = nullptr; // 释放临时对象的所有权
    }
    ~MyClass() { delete x; }
private:
    int* x;
};

MyClass obj1(10);
MyClass obj2 = std::move(obj1); // 使用移动构造函数

5. 委托构造函数 (Delegating Constructor)

委托构造函数是在一个构造函数中调用同一个类的另一个构造函数,从而避免代码重复。这是 C++11 引入的特性。

特点

  • 可以简化多个构造函数之间的代码逻辑,避免重复代码。

示例

class MyClass {
public:
    MyClass() : MyClass(0) { // 委托给参数化构造函数
        // 可以额外执行一些操作
    }
    MyClass(int val) : x(val) {} // 参数化构造函数
private:
    int x;
};

MyClass obj; // 调用默认构造函数,委托给参数化构造函数

6. 显式构造函数 (Explicit Constructor)

explicit 构造函数用于防止隐式类型转换。这对防止错误的自动类型转换特别有用。

特点

  • 防止构造函数被自动调用进行隐式转换。

示例

class MyClass {
public:
    explicit MyClass(int val) : x(val) {} // 显式构造函数
private:
    int x;
};

MyClass obj1(10); // OK
MyClass obj2 = 10; // 错误,显式构造函数禁止隐式转换

7. 析构函数 (Destructor)

虽然析构函数不算构造函数,但与其作用类似。析构函数用于在对象生命周期结束时释放资源。析构函数没有参数,且前面有 ~ 符号。

示例

class MyClass {
public:
    MyClass() { x = new int(10); }
    ~MyClass() { delete x; } // 析构函数
private:
    int* x;
};

总结:

C++ 中构造函数的类型和用途可以总结如下:

  • 默认构造函数: 初始化对象,通常不需要参数。
  • 参数化构造函数: 通过传参初始化对象的成员。
  • 拷贝构造函数: 通过已有对象初始化新对象。
  • 移动构造函数: 移动对象的资源,避免不必要的拷贝。
  • 委托构造函数: 在一个构造函数中调用另一个构造函数。
  • 显式构造函数: 防止隐式类型转换。

这些构造函数为对象的初始化提供了灵活的选择,尤其在管理资源时,合理使用拷贝和移动构造函数可以显著提升程序的效率。

到此这篇关于C++中6种构造函数的文章就介绍到这了,更多相关C++构造函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Windows窗口消息实例详解

    Windows窗口消息实例详解

    这篇文章主要介绍了Windows窗口消息,以实例形式详细罗列了Windows窗口消息,非常具有实用价值,需要的朋友可以参考下
    2015-05-05
  • C语言二叉树的非递归遍历实例分析

    C语言二叉树的非递归遍历实例分析

    这篇文章主要介绍了C语言二叉树的非递归遍历,包括了先序遍历、中序遍历与后序遍历,需要的朋友可以参考下
    2014-09-09
  • C++ 实现高性能HTTP客户端

    C++ 实现高性能HTTP客户端

    HttpClient可以实现所有HTTP的方法,通过API传输接收HTTP消息。本文详细讲解了HttpClient,以及如何运用C++实现HTTP客户端,感兴趣的朋友可以参考一下
    2021-08-08
  • 详解C语言读取文件求某一列的平均值

    详解C语言读取文件求某一列的平均值

    本文粗浅比较了C语言中常用的几种读取文件的函数的效率,并给出了几段求取某列平均值的代码,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多度进步
    2022-02-02
  • Cocos2d-x UI开发之CCControlSlider控件类使用实例

    Cocos2d-x UI开发之CCControlSlider控件类使用实例

    这篇文章主要介绍了Cocos2d-x UI开发之CCControlSlider控件类使用实例,本文代码中包含大量注释讲解了CCControlSlider控件类的使用,需要的朋友可以参考下
    2014-09-09
  • c语言中全局变量的设置方式

    c语言中全局变量的设置方式

    这篇文章主要介绍了c语言中全局变量的设置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • VScode中添加头文件和源文件(C/C++)的方法

    VScode中添加头文件和源文件(C/C++)的方法

    使用VSCode编译C/C++时,会存在找不到头文件的情况,下面这篇文章主要给大家介绍了关于VScode中添加头文件和源文件(C/C++)的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • 使用OpenGL绘制Bezier曲线

    使用OpenGL绘制Bezier曲线

    这篇文章主要为大家详细介绍了使用OpenGL绘制Bezier曲线的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • 关于C语言除0引发的思考

    关于C语言除0引发的思考

    很多 C 库都提供了一组函数用来判断一个浮点数是否是无穷大或 NaN。int _isnan(double x) 函数用来判断一个浮点数是否是 NaN,而 int _finite(double x) 用以判断一个浮点数是否是无穷大
    2013-08-08
  • C/C++实现高并发http服务器的代码示例

    C/C++实现高并发http服务器的代码示例

    这篇文章简单给大家介绍了C/C++实现高并发http服务器的代码示例,文章通过代码和图文介绍的非常详细,感兴趣的同学可以参考阅读
    2023-07-07

最新评论