在C++中,构造器(Constructor)也称为构造函数,它是一种特殊的成员函数,用于在创建对象时初始化对象的数据成员。以下是关于C++构造器的详细介绍:
构造函数的特点
- 名称与类名相同:构造函数的名称必须与它所属的类的名称完全相同。
- 没有返回类型:构造函数不声明返回类型,甚至连
void
也不允许。 - 自动调用:当创建类的对象时,构造函数会被自动调用。
构造函数的分类
1. 默认构造函数
默认构造函数是一种不带任何参数的构造函数。如果类中没有显式定义任何构造函数,编译器会自动提供一个默认构造函数,这个默认构造函数不执行任何操作。一旦你定义了自己的构造函数,编译器就不会再提供默认构造函数。
示例代码:
#include <iostream>class MyClass {
public:// 默认构造函数MyClass() {std::cout << "Default constructor called" << std::endl;}
};int main() {MyClass obj; // 创建对象时自动调用默认构造函数return 0;
}
代码解释:
- 在
MyClass
类中定义了一个默认构造函数,它会在创建MyClass
对象时自动调用,并输出一条信息。
2. 带参数的构造函数
带参数的构造函数允许在创建对象时传递初始值,从而对对象的数据成员进行初始化。
示例代码:
#include <iostream>class Rectangle {
private:int length;int width;
public:// 带参数的构造函数Rectangle(int l, int w) {length = l;width = w;std::cout << "Parameterized constructor called" << std::endl;}int area() {return length * width;}
};int main() {Rectangle rect(5, 3); // 创建对象时传递参数,调用带参数的构造函数std::cout << "Area of rectangle: " << rect.area() << std::endl;return 0;
}
代码解释:
Rectangle
类的构造函数接受两个参数l
和w
,并将它们分别赋值给length
和width
成员变量。- 在
main
函数中创建Rectangle
对象时,传递了参数5
和3
,调用了带参数的构造函数。
3. 拷贝构造函数
拷贝构造函数是一种特殊的构造函数,用于创建一个新对象,该对象是另一个同类对象的副本。如果类中没有显式定义拷贝构造函数,编译器会自动提供一个浅拷贝的拷贝构造函数。
示例代码:
#include <iostream>class Point {
private:int x;int y;
public:Point(int a, int b) : x(a), y(b) {}// 拷贝构造函数Point(const Point& other) {x = other.x;y = other.y;std::cout << "Copy constructor called" << std::endl;}void print() {std::cout << "x: " << x << ", y: " << y << std::endl;}
};int main() {Point p1(1, 2);Point p2(p1); // 调用拷贝构造函数p2.print();return 0;
}
代码解释:
Point
类的拷贝构造函数接受一个const
引用的Point
对象other
,并将其成员变量的值复制到新对象中。- 在
main
函数中,通过Point p2(p1)
创建了一个新对象p2
,它是p1
的副本,调用了拷贝构造函数。
构造函数的初始化列表
构造函数的初始化列表用于在构造函数体执行之前初始化类的数据成员。它可以提高效率,尤其是对于常量成员和引用成员。
示例代码:
#include <iostream>class Circle {
private:const double pi;double radius;
public:// 使用初始化列表初始化常量成员和普通成员Circle(double r) : pi(3.14159), radius(r) {std::cout << "Circle constructor called" << std::endl;}double area() {return pi * radius * radius;}
};int main() {Circle c(5);std::cout << "Area of circle: " << c.area() << std::endl;return 0;
}
代码解释:
- 在
Circle
类的构造函数中,使用初始化列表pi(3.14159), radius(r)
对pi
和radius
进行初始化。pi
是常量成员,必须在初始化列表中进行初始化。