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