C++默认构造函数详解

 更新时间:2026年06月05日 08:50:55   作者:Yolo_TvT  
本文详细解析了C++中默认成员函数的概念,包括默认构造函数的作用与生成规则,并探讨了何时需要自定义默认构造函数及其应用场景,感兴趣的朋友一起看看吧

一、类的默认成员函数

  • 当你定义一个空类时,编译器并不会真的“空手而归”。它会自动为你生成6个(C++98)或更多(C++11后)特殊的成员函数。这些函数被称为默认成员函数。
  • 他们分别是:
函数作用
默认构造函数初始化对象
析构函数清理对象资源
拷贝构造函数用已有对象初始化新对象
赋值运算符重载将已有对象赋值给另一对象
移动构造函数(C++11)用临时对象“转移”资源
移动赋值运算符(C++11)临时对象赋值
  • 如果没有主动声明这些函数,编译器就会自动生成一个默认版本,即为默认成员函数。

二、构造函数的基本概念

  • 构造函数是类中一种特殊的成员函数,它在对象创建时自动调用,用于初始化对象的成员变量。

构造函数的规则:

  • 函数名与类名完全相同
  • 没有返回值
  • 可以重载(可以有多个参数不同的构造函数)
  • 对象创建时自动执行

三、默认构造函数的含义

  • 默认构造函数是指可以无实参可调用的构造函数。它包括两种情况:
    • 程序员定义的默认构造函数:
      • 程序员定义的无参构造函数。
      • 程序员定义的全缺省参数的构造函数。
    • 程序员没有定义构造函数,编译器自动生成的隐式默认构造函数。
class Student {
public:
    // 无参构造函数
    Student() {
        name = "无名";
        age = 0;
    }
private:
    string name;
    int age;
};
cpp
class Point {
public:
    // 全缺省参数的构造函数(也是默认构造函数)
    Point(int x = 0, int y = 0) : x(x), y(y) {}
private:
    int x, y;
};

四、编译器自动生成的默认构造函数

  • 若程序员没有实现构造函数,编译器会为你生成一个隐式默认构造函数。
class Dog {
    string name;
    int age;
    // 编译器自动生成 Dog() {}
};

这个隐式构造函数会做什么?

  • 对于内置类型(int, char, 指针等):不做任何初始化(不同编译器效果不同)。
  • 对于自定义类型成员:调用它们各自的默认构造函数。
#include <iostream>
using namespace std;
class A {
public:
    A() { cout << "A的构造函数" << endl; }
};
class B {
    int x;      // 内置类型,不会初始化(垃圾值)
    A a;        // 类类型,会调用A的默认构造函数
};
int main() {
    B b;   // 输出:A的构造函数(x保持随机)
}

一旦你实现了构造函数,编译器就不再生成默认构造函数

class Student {
public:
    Student(string n) { name = n; }  // 自定义构造函数
private:
    string name;
};
int main() {
    Student s1("张三");  // 正确
    // Student s2;       // 错误!没有默认构造函数可用
}

如果你既需要带参构造,又需要无参构造,需要手动提供默认构造函数。

五、默认构造函数的用途

1. 定义对象而不初始化

class Array {
    int* data;
public:
    Array() { data = nullptr; }  // 允许定义空数组对象
};
Array arr;   // 调用默认构造

2. 作为容器元素的默认构造要求

STL容器(如vector)在扩容或创建元素时,经常需要元素的默认构造函数。

vector<Student> v(10);  // 需要Student有默认构造函数

3. 继承体系中基类的初始化

派生类构造函数会自动调用基类的默认构造函数(如果基类没有默认构造,派生类必须显式调用基类的带参构造)。

六、什么时候需要自定义默认构造函数?

情况是否需要
类没有指针成员,且成员都有合理的默认值不需要,编译器生成即可
成员中需要分配资源需要(在构造中分配并初始化)
需要给成员变量设置特定的初始值需要
类有自定义的带参构造,但仍需无参创建对象需要
class MyString {
    char* buf;
public:
    // 自定义默认构造:给指针一个安全的初始值
    MyString() {
        buf = new char[1];
        buf[0] = '\0';
    }
};

七、C++11 的改进:default 和 delete

C++11允许你显式要求编译器生成默认版本,或禁止某个构造函数。

class Widget {
public:
    Widget() = default;           // 手动要求编译器生成默认构造
    Widget(const Widget&) = delete; // 禁止拷贝构造
};

八、一个完整的例子

#include <iostream>
#include <string>
using namespace std;
class Book {
public:
    // 默认构造函数
    Book() {
        title = "未命名";
        price = 0.0;
        cout << "调用默认构造函数" << endl;
    }
    // 带参构造函数(不是默认构造)
    Book(string t, double p) : title(t), price(p) {
        cout << "调用带参构造函数" << endl;
    }
    void print() {
        cout << "书名:" << title << ",价格:" << price << endl;
    }
private:
    string title;
    double price;
};
int main() {
    Book b1;              // 调用默认构造
    Book b2("C++教程", 59.9); // 调用带参构造
    b1.print();
    b2.print();
    return 0;
}
输出:
text
调用默认构造函数
调用带参构造函数
书名:未命名,价格:0
书名:C++教程,价格:59.9

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

相关文章

  • c++函数指针和回调函数示例

    c++函数指针和回调函数示例

    这篇文章主要介绍了c++函数指针和回调函数示例,需要的朋友可以参考下
    2014-05-05
  • 详解次小生成树以及相关的C++求解方法

    详解次小生成树以及相关的C++求解方法

    这篇文章主要介绍了详解次小生成树以及相关的C++求解方法,文中的练习示例采用了kruskal算法通过C++进行求解,需要的朋友可以参考下
    2015-08-08
  • 解析c中stdout与stderr容易忽视的一些细节

    解析c中stdout与stderr容易忽视的一些细节

    本篇文章是对在c语言中stdout与stderr容易忽视的一些细节进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言实现简单飞机大战

    C语言实现简单飞机大战

    这篇文章主要为大家详细介绍了C语言实现简单飞机大战,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • 基于C语言实现井字棋游戏

    基于C语言实现井字棋游戏

    这篇文章主要为大家详细介绍了基于C语言实现井字棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • ubuntu20.04中vscode使用ROS的详细方法

    ubuntu20.04中vscode使用ROS的详细方法

    这篇文章主要介绍了ubuntu20.04 vscode使用ROS的详细方法,主要包括在vscode安装扩展创建工作文件夹的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • C++详解默认参数的构造函数及简单实例代码

    C++详解默认参数的构造函数及简单实例代码

    这篇文章主要介绍了 C++详解默认参数的构造函数及简单实例代码的相关资料,需要的朋友可以参考下
    2017-02-02
  • 详解C语言通过递归与非递归实现蛇形矩阵

    详解C语言通过递归与非递归实现蛇形矩阵

    蛇形矩阵(Snake matrix)是矩阵的一种,常被应用在编程题目与数学数列中,需要提取每条斜线里最小的数字,本篇文章将会通过递归和非递归来分别实现蛇形矩阵
    2022-02-02
  • C++字符串提取和分割的多种方法

    C++字符串提取和分割的多种方法

    在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用场景和优缺点,我们将通过多个示例代码逐步讲解,帮助读者掌握字符串处理的技巧,需要的朋友可以参考下
    2025-03-03
  • Qt正则表达式使用举例

    Qt正则表达式使用举例

    这篇文章主要给大家介绍了关于Qt正则表达式使用的相关资料,Qt中的正则表达式模式匹配功能由QRegExp类实现,它完全支持Unicode,并可以应用于字符串验证、搜索、查找替换和分割等场景,需要的朋友可以参考下
    2024-02-02

最新评论