C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++默认构造函数,C++构造函数

C++默认构造函数详解

作者:Yolo_TvT

本文详细解析了C++中默认成员函数的概念,包括默认构造函数的作用与生成规则,并探讨了何时需要自定义默认构造函数及其应用场景,感兴趣的朋友一起看看吧

一、类的默认成员函数

函数作用
默认构造函数初始化对象
析构函数清理对象资源
拷贝构造函数用已有对象初始化新对象
赋值运算符重载将已有对象赋值给另一对象
移动构造函数(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() {}
};

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

#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++:默认构造函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文