下面是“详解C++构造函数”的完整攻略:
什么是构造函数
在 C++ 中,构造函数是一种特殊的函数,用于在对象创建时初始化对象的数据成员。它的名字和类名相同,没有返回值,没有 void 关键字,可以有参数,也可以没有参数。构造函数的目的是确保每次对象创建时都能正确地初始化数据成员。
构造函数的分类
默认构造函数
如果一个类没有定义构造函数,那么编译器会自动为这个类生成一个默认构造函数。默认构造函数没有参数,也没有函数体,它只是对对象的成员变量进行默认初始化,比如数值类型的成员变量被初始化为 0,指针类型的成员变量被初始化为 NULL。如果类中没有指针类型的成员变量,则可以使用默认构造函数进行类的创建。
下面是一个使用默认构造函数的示例:
#include <iostream>
using namespace std;
class Person {
public:
int age;
string name;
};
int main() {
Person p;
cout << p.name << " " << p.age << endl;
return 0;
}
输出:
0
带参数的构造函数
带参数的构造函数可以接受参数,用于初始化对象的数据成员。当对象被创建时,参数会传递给构造函数,构造函数使用传递的参数来初始化对象。一个类可以定义多个带参数的构造函数,这些构造函数的参数列表可以不同,叫做重载构造函数。
下面是一个使用带参数的构造函数的示例:
#include <iostream>
using namespace std;
class Person {
public:
int age;
string name;
Person(int _age, string _name) : age(_age), name(_name) {}
};
int main() {
Person p(18, "Bob");
cout << p.name << " " << p.age << endl;
return 0;
}
输出:
Bob 18
拷贝构造函数
拷贝构造函数用来初始化一个对象,它的参数是一个对象的引用,用来告诉构造函数应该如何构造新的对象。如果没有定义拷贝构造函数,那么编译器会自动为这个类生成一个拷贝构造函数,进行浅拷贝。如果类中包含动态内存分配的成员,那么需要手动实现拷贝构造函数,进行深拷贝。
下面是一个使用拷贝构造函数的示例:
#include <iostream>
using namespace std;
class Person {
public:
int age;
string name;
Person() {}
Person(int _age, string _name) : age(_age), name(_name) {}
Person(const Person& other) { // 拷贝构造函数
age = other.age;
name = other.name;
}
};
int main() {
Person p1(18, "Bob");
Person p2 = p1; // 调用拷贝构造函数
cout << p2.name << " " << p2.age << endl;
return 0;
}
输出:
Bob 18
构造函数的调用
隐式调用
在创建对象时可以不写构造函数的调用,这是因为编译器会自动调用默认构造函数。例如:
Person p; // 隐式调用默认构造函数
显式调用
在创建对象时可以显式调用构造函数,语法为类名(参数列表)。例如:
Person p1(18, "Bob"); // 显式调用带参数的构造函数
Person p2 = Person(18, "Bob"); // 显式调用带参数的构造函数,p2 和 p1 是等价的
总结
构造函数是一种特殊的函数,它的作用是初始化对象的数据成员,确保每次对象创建时都能正确地初始化。构造函数可以分为默认构造函数、带参数的构造函数和拷贝构造函数。默认构造函数由编译器自动生成,带参数的构造函数可以接受参数进行初始化,拷贝构造函数用来初始化一个对象并进行深拷贝。构造函数可以隐式调用、也可以显式调用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C++构造函数 - Python技术站