c++构造函数
2018-03-05 本文已影响4人
Kai_Z
简介
目前C++标准已经发展到C++17,随着右值引用等相关内容的加入,C++中的构造函数也逐渐丰富,在开始后面的章节之前,需要先记住如下几个术语:
- 默认构造函数
- 带参数构造函数
- 拷贝构造函数
- 拷贝赋值运算符
- 移动构造函数
- 移动赋值运算符
后续先实现一个简单的类,大概讲解一下这些构造函数,后面通过这些知识点分析vector的构造函数。
// test.h
//后文中会逐步定义每个构造函数
class Test
{
public:
Test(); // 默认构造函数
Test(int value); // 初始化构造函数
Test(const Test& value); // 拷贝构造函数
Test& operator=(const Test& value); // 拷贝赋值运算符
Test(Test&& value); // 移动构造函数
Test& operator=(Test&& value); //移动赋值运算发
~Test();
private:
int num;
}
默认构造函数
什么是默认构造函数?
在c++中,默认构造函数是不带参数的构造函数或者所有的形参都提供了默认实参的构造函数。
//test.cpp
Test::Test()
{
num = 0;
}
带参数构造函数
所谓带参数的构造函数是指在创建对象的时候,需要显示的提供参数。
//test.cpp
Test::Test(int value):num(value)
{
}
拷贝构造函数
什么是拷贝构造函数?
拷贝构造函数是基于同一类型的其他对象来创建及初始化一个新的对象,其第一个参数必须是该类型的左值引用。
//test.cpp
Test::Test(Test& value)
{
num = value.num;
}
拷贝赋值运算符
一般情况下,当我们显示的定义了 拷贝构造函数 时,我们会同时定义相应的拷贝赋值运算符
什么是拷贝赋值运算符?
在c++中,=
被称为赋值运算符,赋值运算符左右两次的对象为相同的类型,通过定义相应的拷贝赋值运算符,可以正确的完成对象间的赋值。
ps:可能读到这里会有点糊涂,但是可以先记着有这个东西,后面在详细讲解这个存在的意义
//test.cpp
Test& operator=(const Test& value)
{
num = value.num;
return *this;
}
移动构造函数
随着C++11对右值引用的支持,移动构造函数借助右值引用被实现。
什么是移动构造函数?
移动构造函数通过一个接管一个临时对象的资源来创建一个新的对象。
Test::Test(Test&& value)
{
num = value.num;
}
移动赋值运算符
一般情况下当我们定义了移动构造函数时,同样也会定义移动赋值运算符。
什么是移动赋值运算符?
移动赋值运算符完成的工作与移动构造函数相同。
Test& operator=(Test&& value)
{
num = value.num;
return *this;
}