什么是构造函数,构造函数的作用
构造函数说白了就是在类里面在定义对象的时候,对类中的数据成员进行初始化的函数。那构造函数和一般的成员函数有什么不同呢。
1、构造函数名和类名是一样的;
2、构造函数没有返回类型;
3、一个类中可以定义多个构造函数;
4、构造函数在创建对象时,自动调用
#include<iostream>
#include<Windows.h>
using namespace std;
//定义一个类
class Human {
private:
int a;
public:
Human(int a);//构造函数定义
};
Human::Human(int a) { //构造函数实现
this->a = a;
}
int main() {
Human zhangsan(3); //定义了一个张三类,同时通过构造函数对类数据成员初始化
system("pause");
return 0;
}
构造函数分为哪几类
构造函数分为:
1、默认构造函数;
2、自定义重载构造函数;
3、拷贝构造函数;
4、赋值构造函数;
下面将为分别讲解各构造函数的特点,以及如何使用:
1) 默认构造函数:合成默认构造函数(合成默认构造函数是程序员没有定义构造函数时,系统自动生成的,没有任何参数,没有任何行为。当且仅当类中所有数据成员,使用类内初始化,才使用合成默认构造函数。不过只要程序员定义了构造函数,系统则不会生成合成默认构造函数)。手动定义默认构造函数(该构造函数一样没有参数,不过是程序员进行手动定义,对类中数据成员进行初始化。注意:当一个类的数据成员同时有类内初始化和手动定义的默认构造函数初始化,以后者为准!)
class Human {
private:
int a;
int b;
public:
Human(); //手动定义默认构造函数
Human(int a);
};
Human::Human() { //手动定义默认构造函数实现
a = 10;
b = 4;
}
Human::Human(int a) {
this->a = a;
}
2)自定义重载构造函数:自定义重载构造函数,是程序手动定义,不过有多个参数。通过定义对象时,通过输出参数给构造函数,对类中数据车成员进行初始化。
class Human {
private:
int a;
int b;
public:
Human(); //手动定义默认构造函数
Human(int a); //自定义重载构造函数
};
Human::Human() { //手动定义默认构造函数实现
a = 10;
b = 4;
}
Human::Human(int a) {//自定义重载构造函数的实现
this->a = a;
}
3)拷贝构造函数:其作用是将一个已经进行初始化的对象的类数据成员赋值给一个刚定义的对象。定义的方式为:Human (const Human &other),自定义为深拷贝,合成拷贝构造函数为浅拷贝。
使用如下:
#include<iostream>
#include<Windows.h>
using namespace std;
//定义一个类
class Human {
private:
int a;
int b;
public:
Human(); //手动定义默认构造函数
Human(int a); //自定义重载构造函数
Human(const Human &other); //声明拷贝构造函数
};
Human::Human() { //手动定义默认构造函数实现
a = 10;
b = 4;
}
Human::Human(int a) {//自定义重载构造函数的实现
this->a = a;
}
Human::Human(const Human &other) { //拷贝构造函数的实现
this->a = other.a;
this->b = other.b;
}
int main() {
Human zhangsan(3); //定义了一个张三类,同时通过构造函数对类数据成员初始化
Human lisi = zhangsan;//通过拷贝构造函数,把参数赋值给lisi对象
system("pause");
return 0;
}
什么时候调用拷贝构造函数:
a:函数实参是对象,形参不是引用类型的
b:在函数返回类型是类,不是引用类型的
c:对象数组初始化列使用对象的
4)赋值构造函数:赋值构造函数是为了已经存在的对象进行赋值。如果自己没有定义,编译器会自己定义“合成构造函数”。不过是浅拷贝。合成构造函数的声明如下Human& operater=(const Human &other);
#include<iostream>
#include<Windows.h>
using namespace std;
//定义一个类
class Human {
private:
int a;
int b;
public:
Human(); //手动定义默认构造函数
Human(int a); //自定义重载构造函数
Human(const Human &other); //声明拷贝构造函数
Human& operator=(const Human &other);//赋值构造函数的声明
};
Human::Human() { //手动定义默认构造函数实现
a = 10;
b = 4;
}
Human::Human(int a) {//自定义重载构造函数的实现
this->a = a;
}
Human::Human(const Human &other) { //拷贝构造函数的实现
this->a = other.a;
this->b = other.b;
}
Human& Human::operator=(const Human &other) { //赋值构造函数的实现
this->a = other.a;
this->b = other.b;
return *this;
}
int main() {
Human zhangsan(3); //定义了一个张三类,同时通过构造函数对类数据成员初始化
Human lisi = zhangsan;//通过拷贝构造函数,把参数赋值给lisi对象
Human wanger(6); //定义王二对象
wanger = zhangsan; //调用赋值构造函数
system("pause");
return 0;
}