一、构造函数的分类
构造函数分为三类:
- 无参数构造函数
- 有参数构造函数(有3种使用形式)
- 赋值构造函数或叫拷贝构造函数(初始化与赋值是两个概念期间只会调用一次构造函数!!)
二、构造函数分类演示
此处特别注意:
- C++对等号操作符进行了功能性增强
- 有参数构造函数第二种使用方法时要注意逗号表达式,逗号表达式的最后一个值是才是这个表达式的值
- 如:Test2 t2_22 = (3, 4); //实际上调用的也是一个参数的构造函数(传入的为4)
- 通过拷贝构造函数完成 t3 对象的初始化,并不等同于t3=t2_2 (这里是赋值)初始化与赋值是两个概念。
拷贝构造函数只会调用一次构造函数。期间产生一个匿名对象,直接把匿名对象转成 t3.Test2 t3 = t2_2;
#include<iostream>
using namespace std;
class Test2
{
public:
Test2() {
a = 0;
b = 0;
cout << "无参数构造函数" << endl;
}
Test2(int m_a, int m_b){
a = m_a;
b = m_b;
cout << "有参数构造函数" << endl;
}
Test2(int m_a) {
a = m_a;
cout << "有参数构造函数" << endl;
}
Test2(const Test2& obj) {
cout << "赋值构造函数/拷贝构造函数" << endl;
}
~Test2()//析构函数
{
}
private:
int a;
int b;
};
//给对象搭建一个舞台,研究对象完整的生命周期
void objectplay2()
{
Test2 t1;//调用无参数构造函数
//调用有参数构造函数3种方法
//第一种
Test2 t2_1(1, 2);
//第二种(仅适用于一个参数)
Test2 t2_2 = 2;//C++对等号操作符进行了功能性增强
//逗号表达式最后一个值是这个表达式的值
Test2 t2_22 = (3, 4);//实际上调用的也是一个参数的构造函数
//第三种 直接调用构造函数完成t3对象的初始化
//并不等同于t3=t2_2 (这里是赋值)初始化与赋值是两个概念
//只会调用一次构造函数!!优化了
Test2 t3 = t2_2;//这种方法会产生一个匿名对象
//匿名对象的生命周期非常重要
int main()
{
system("pause");
}
三、为什么需要构造函数
如果没有构造函数就需要自己定义一个initialize函数,需要在对象创建之后手动调用函数进行初始化。
- initialize函数只是一个普通的函数,必须显示调用
- 一旦由于失误的原因对象没有初始化,那么结果将不确定。没有初始化的对象其内部成员变量的值是不定的。
- 初始多个对象时操作复杂