📅  最后修改于: 2023-12-03 14:39:55.923000             🧑  作者: Mango
在 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)
的构造函数,它带有两个整数参数 width
和 height
。在创建 Rectangle
对象 rect
时,它将自动调用摩它构造函数,并将 3
和 4
作为参数传递给构造函数。
复制构造函数,也称为拷贝构造函数,是一个带有单个参数的构造函数,用于将另一个对象的值复制到新对象中。它的声明如下:
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
对象时,可以省略参数,此时将使用默认值。