什么是构造函数

类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。 构造,那构造的是什么呢?构造成员变量的初始化值,内存空间等 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于 为某些成员变量设置初始值。

下面的实例有助于更好地理解构造函数的概念

#include <iostream>
#include <string>
using namespace std; // 使用std命名空间
class Car {
public:
string brand; // 不需要使用std::string
int year;
// 无参构造函数
Car() {
brand = "未知";
year = 0;
cout << "无参构造函数被调用" << endl; // 不需要使用std::cout和std::endl
}
void display() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}
};
int main() {
Car myCar; // 创建Car对象
myCar.display(); // 显示车辆信息
return 0;
}

带参数构造函数

默认的构造函数没有任何参数,但如果需要,构造函数也可以带有参数。这样在创建对象时就会给对象 赋初始值,如下面的例子所示:

#include <iostream>
#include <string>
using namespace std;
class Car {
public:
string brand;
int year;
// 带参数的构造函数,使用常规的赋值方式
Car(string b, int y) {
brand = b;
year = y;
}
void display() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}};
int main() {
Car myCar("Toyota", 2020); // 使用带参数的构造函数创建Car对象
myCar.display(); // 显示车辆信息
return 0;
}


拷贝构造函数

基本概念及发生条件

拷贝构造函数是 C++ 中的一种特殊的构造函数,用于创建一个新对象作为现有对象的副本。它在以下几 种情况下被调用:

1. 当一个新对象被创建为另一个同类型的现有对象的副本时:

例如: MyClass obj1 = obj2; 或 MyClass obj1(obj2); ,其中 obj2 是现有的对象。

2. 将对象作为参数传递给函数时(按值传递):

当对象作为参数传递给函数,并且参数不是引用时,会使用拷贝构造函数创建函数内部的对象 副本。

3. 从函数返回对象时(按值返回):

当函数返回对象,并且没有使用引用或指针时,拷贝构造函数用于从函数返回值创建副本。

4. 初始化数组或容器中的元素时

例如,在创建一个包含对象的数组时,数组中的每个对象都是通过拷贝构造函数初始化的。 拷贝构造函数的典型声明如下:

class MyClass {
public:
MyClass(const MyClass& other);
};

其中, other 是对同类型对象的引用,通常是常量引用。

示例代码

#include <iostream>
#include <string>
using namespace std;
class Car {
public:
string brand;
int year;
// 常规构造函数
Car(string b, int y) : brand(b), year(y) {}
// 拷贝构造函数Car(const Car& other) {
brand = other.brand;
year = other.year;
cout << "拷贝构造函数被调用" << endl;
}
void display() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}
};
int main() {
Car car1("Toyota", 2020); // 使用常规构造函数
Car car2 = car1; // 使用拷贝构造函数
car1.display();
car2.display();
return 0;
} Car(const Car& other) {
brand = other.brand;
year = other.year;
cout << "拷贝构造函数被调用" << endl;
}
void display() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}
};
int main() {
Car car1("Toyota", 2020); // 使用常规构造函数
Car car2 = car1; // 使用拷贝构造函数
car1.display();
car2.display();
return 0;
}