C++教程-C++构造函数
C++构造函数
在C++中,构造函数是一种特殊的方法,在对象创建时自动调用。它用于初始化新对象的数据成员。C++中的构造函数与类或结构体具有相同的名称。
简而言之,当在C++中创建对象时,会自动调用一个特定的过程,称为构造函数。通常情况下,它用于创建新事物的数据成员。在C++中,类或结构体的名称也作为构造函数的名称。当对象完成时,构造函数被调用。由于它创建值或为事物提供数据,所以称为构造函数。
构造函数的原型如下:
<class-name>(参数列表);
以下语法用于定义类的构造函数:
<class-name>(参数列表) { // 构造函数定义 }
以下语法用于在类外定义构造函数:
<class-name>::<class-name>(参数列表) { // 构造函数定义 }
构造函数没有返回类型,因为它们没有返回值。
C++中有两种类型的构造函数:
- 默认构造函数
- 带参数的构造函数
C++默认构造函数
没有参数的构造函数被称为默认构造函数。它在创建对象时被调用。
让我们看一个C++默认构造函数的简单示例。
#include <iostream>
using namespace std;
class Employee
{
public:
Employee()
{
cout << "默认构造函数被调用" << endl;
}
};
int main(void)
{
Employee e1; // 创建一个Employee对象
Employee e2;
return 0;
}
输出:
默认构造函数被调用
默认构造函数被调用
C++参数化构造函数
具有参数的构造函数被称为参数化构造函数。它用于为不同的对象提供不同的值。
让我们看一个C++参数化构造函数的简单示例。
#include <iostream>
using namespace std;
class Employee {
public:
int id; // 数据成员(也称为实例变量)
string name; // 数据成员(也称为实例变量)
float salary;
Employee(int i, string n, float s)
{
id = i;
name = n;
salary = s;
}
void display()
{
cout << id << " " << name << " " << salary << endl;
}
};
int main(void) {
Employee e1 = Employee(101, "Sonoo", 890000); // 创建一个Employee对象
Employee e2 = Employee(102, "Nakul", 59000);
e1.display();
e2.display();
return 0;
}
输出:
101 Sonoo 890000
102 Nakul 59000
构造函数与普通成员函数有什么区别?
- 构造函数的名称与所属类的名称相同。
- 默认构造函数没有输入参数。然而,对于复制和带参数的构造函数,可以使用输入参数。
- 构造函数没有返回类型。
- 在创建对象时,构造函数会自动调用。
- 构造函数必须在类的公共区域中声明。
- 如果没有指定构造函数(没有期望任何参数并且具有空函数体),C++编译器会为对象创建一个默认构造函数。
通过一个实际的例子来了解C++中的不同构造函数类型。想象一下你去商店买记号笔。如果你想买一个记号笔,你有什么选择?第一种情况下,你只是要求商店给你一个记号笔,因为你没有指定你想要的品牌或颜色,只是请求一个数量。所以当我们只说“我只需要一个记号笔”时,他会把市场上或他店里最受欢迎的记号笔给我们。默认构造函数正是它所听起来的那样!第二种方法是进入商店并说明你想要一个红色的XYZ品牌的记号笔。因为你提到了这个话题,他会给你那只记号笔。在这种情况下已经设置了参数。带参数的构造函数正是它所听起来的那样!第三种方法需要你去商店并声明你想要一个看起来像这样的记号笔(手上的一个物理记号笔)。这样店主会注意到那个记号笔。当你说好了,他会给你一个全新的记号笔。因此,复制那只记号笔。这就是复制构造函数所做的!
构造函数的特点是什么?
- 构造函数与它所属类具有相同的名称。
- 虽然可以,但构造函数通常在类的public部分中声明。但这不是必须的。
- 由于构造函数没有返回值,所以它们没有返回类型。
- 在创建类对象时,构造函数会自动调用。
- 可以有重载的构造函数。
- 不允许将构造函数声明为虚函数。
- 不能继承构造函数。
- 构造函数的地址不能被引用。
- 在分配内存时,构造函数会隐式调用new和delete运算符。
什么是拷贝构造函数?
拷贝构造函数是一种称为拷贝构造函数的成员函数,它使用同类的另一个对象初始化一个对象-有关拷贝构造函数的详细讨论。
当为一个类指定一个或多个非默认构造函数(带有参数)时,我们也需要包含一个默认构造函数(没有参数),因为在这种情况下编译器不会提供一个。最佳实践是始终声明一个默认构造函数,即使它不是必需的。
拷贝构造函数需要引用同一类的对象。
cppCopy code
Sample(Sample &t)
{
id = t.id;
}
什么是析构函数?
析构函数是与构造函数相对应的特殊成员函数。构造函数创建类的对象,而析构函数用于销毁这些对象。析构函数的名称与类名相同,前面加上波浪线(~)。每次只能定义一个析构函数。使用析构函数是销毁由构造函数创建的对象的一种方式。因此,析构函数不可重载。析构函数不接受任何参数,也不返回任何值。一旦对象离开其作用域,析构函数立即被调用。析构函数释放构造函数生成的对象所使用的内存。析构函数通过销毁对象来逆转创建对象的过程。
定义类的析构函数的语法如下:
cppCopy code
~<class-name>()
{
// 析构函数定义
}
在类外定义类的析构函数的语法如下:
cppCopy code
<class-name>::~<class-name>()
{
// 析构函数定义
}
需要注意的是,每个类只能有一个析构函数。