📜  C++ 程序的输出 |第 26 组(构造函数)(1)

📅  最后修改于: 2023-12-03 14:39:55.923000             🧑  作者: Mango

C++ 程序的输出 | 第 26 组(构造函数)

在 C++ 中,构造函数是一种特殊类型的成员函数,用于初始化对象的数据成员。当对象被创建时,构造函数会被自动调用。构造函数的名称与类名相同,不返回任何类型,也不需要显式地调用。

本文将介绍 C++ 中的构造函数及其使用,包括:

  • 构造函数的基本语法
  • 带参数的构造函数
  • 复制构造函数
  • 默认构造函数
  • 构造函数的默认参数
构造函数的基本语法

构造函数通常定义在类的公有部分,其基本语法如下:

class MyClass {
  public:
    MyClass(); // 构造函数的声明
};

MyClass::MyClass() {
  // 构造函数的实现
}

在上面的代码中,MyClass 是一个类,它包含一个构造函数 MyClass()。该构造函数没有参数,它的实现位于类的定义外部。

当创建对象时,将自动调用其构造函数,例如:

MyClass obj; // 创建 MyClass 对象 obj,自动调用其构造函数
带参数的构造函数

构造函数也可以带参数,使用方法与普通函数类似,例如:

class Rectangle {
  public:
    Rectangle(int width, int height); // 带参数的构造函数声明

  private:
    int width_;
    int height_;
};

Rectangle::Rectangle(int width, int height) {
  width_ = width;
  height_ = height;
}

int main() {
  Rectangle rect(3, 4); // 创建名为 rect 的 Rectangle 对象,width_ = 3,height_ = 4
}

在上面的代码中,Rectangle 类包含一个名为 Rectangle(int, int) 的构造函数,它带有两个整数参数 widthheight。在创建 Rectangle 对象 rect 时,它将自动调用摩它构造函数,并将 34 作为参数传递给构造函数。

复制构造函数

复制构造函数,也称为拷贝构造函数,是一个带有单个参数的构造函数,用于将另一个对象的值复制到新对象中。它的声明如下:

class MyClass {
  public:
    MyClass(const MyClass& rhs); // 复制构造函数的声明
};

在上面的代码中,MyClass 类包含一个名为 MyClass(const MyClass&) 的复制构造函数,它以常量引用形式接受另一个 MyClass 对象 rhs。常量引用确保对象不会被修改,以避免不必要的副作用。

例如:

class Person {
  public:
    Person(const std::string& name, int age) : name_(name), age_(age) {} // 带参数的构造函数

    Person(const Person& rhs) : name_(rhs.name_), age_(rhs.age_) {} // 复制构造函数

  private:
    std::string name_;
    int age_;
};

int main() {
  Person p1("Tom", 20);
  Person p2 = p1; // 调用复制构造函数
}

在上面的代码中,Person 类包含一个带参数的构造函数和一个复制构造函数,当使用 Person 对象 p1 初始化 Person 对象 p2 时,将调用复制构造函数。

默认构造函数

如果类没有定义任何构造函数,则编译器将自动为其生成一个默认构造函数。默认构造函数不带任何参数,也不执行任何操作。

例如:

class MyClass {
};

int main() {
  MyClass obj; // 创建 MyClass 对象 obj,自动生成默认构造函数
}

在上面的代码中,MyClass 类没有定义任何构造函数,因此编译器将自动生成一个默认构造函数。

构造函数的默认参数

构造函数可以有默认参数,与普通函数类似。当没有提供参数时,将使用默认参数。

例如:

class MyClass {
  public:
    MyClass(int a = 0, int b = 0) : a_(a), b_(b) {} // 带默认参数的构造函数

  private:
    int a_;
    int b_;
};

int main() {
  MyClass obj1; // a_ = 0,b_ = 0
  MyClass obj2(1); // a_ = 1,b_ = 0
  MyClass obj3(2, 3); // a_ = 2,b_ = 3
}

在上面的代码中,MyClass 类包含一个带有默认参数的构造函数。当创建 MyClass 对象时,可以省略参数,此时将使用默认值。