目录
9.2 构造函数
9.2.1 构造函数的概述
9.2.2 构造函数定义方法(初始化构造函数)
9.2.3 提供构造函数的影响
9.2 构造函数
以下是一些C++引入构造函数的原因:
初始化对象:构造函数允许在创建对象时立即初始化该对象的成员变量。通过在构造函数中指定初始值,可以确保对象在使用之前具有合适的初始状态,避免了未初始化的对象和潜在的错误。未初始化的对象和成员,在使用中很容易造成未知的错误,所以尽量要避免使用未初始化的对象。
参数化对象初始化:构造函数可以接受参数,并使用这些参数来设置对象的状态。这样,通过在创建对象时传递不同的参数,可以方便地初始化不同的对象实例。
自定义对象的实例化方式:通过定义不同类型的构造函数,可以实现不同的对象实例化方式。例如,可以指定不同的构造函数来处理不同的参数组合,从而实现重载的构造函数。
类型转换和隐式构造:C++允许使用单参数的构造函数作为隐式转换的一部分。这使得可以通过将一个特定参数的类型隐式地转换为对象类型来创建和初始化对象。
简单理解一件事:初始化是在程序第一次运行时给变量和函数设定初始值的过程。比如,如果我们希望一个用来计数的整数变量初始值为0,就需要在程序启动时对这个变量进行初始化,即设置初始值为0。引入类和对象后,构造函数就成为了初始化对象的特殊函数。当我们创建对象时,构造函数会运行,负责对对象的成员变量进行赋值和执行其他操作。我们可以在构造函数中初始化和赋值普通成员变量和函数,确保对象在创建时有适当的状态和行为。通过构造函数的使用,我们能够灵活地初始化对象,满足不同需求。
9.2.1 构造函数的概述
类在实例化对象的时候,系统自动调用构造函数完成对象的初始化。如果用户不提供构造函数编译器会自动添加一个默认的构造函数(空函数)。
C++为了给我们提供这种问题的解决方案,构造函数和析构函数,这两个函教将会被编译器自动调用,完成对象初始化和对象清理工作。无论你是否需要,对象的初始化和清理工作是编译器强制我们要做的事情,即使你不提供初始化操作和清理操作,编译器也会给你增加默认的操作,
9.2.2 构造函数定义方法(初始化构造函数)
构造函数名和类名相同,没有返回值类型(连void都不可以),可以有参数(可以重载)先给对象开辟空间(实例化) 然后调用构造函数(初始化)。在public权限下进行构造函数的定义。
代码:
#include <iostream>using namespace std;class Data{
public:int mA;
public://无参构造函数Data(){mA = 0;cout << "无参构造函数" << endl;}//有参构造函数Data(int a){mA = a;cout << "有参构造函数 ,mA = " << mA << endl;}};void test01(){//隐式调用无参构造函数(推荐写法)Data da1;//显示调用无参构造函数Data da2 = Data();//隐式调用有参构造函数(推荐写法)Data da3(10);//显示调用有参构造函数Data da4 = Data(11);//匿名对象(无参) 当前语句结束后立即自动释放该对象Data();Data(20);//构造函数隐式转换Data da5 = 111;//适用于类中只有一个数据成员}int main()
{test01();return 0;
}
9.2.3 提供构造函数的影响
如果用户不提供任何构造函数 编译器默认提供一个空的无参构造如果用户定义了构造函数(不管是有参、无参),编译器不再提供默认构造函数
第一种情况,对象没有构造函数时怎么办?(此时系统会提供默认的构造和析构函数)
案例代码:
class Data{
public:int mA;
public:
#if 0//无参构造函数Data(){mA = 0;cout << "无参构造函数" << endl;}
#endif#if 0//有参构造函数Data(int a){mA = a;cout << "有参构造函数 ,mA = " << mA << endl;}
#endif
};void test02(){Data da1;cout << da1.mA <<endl;
}
第二种情况,提供一个有参构造函数。定义对象时使用无参构造对象。此时不管如何,系统都不会给你定义新的无参或者有参构造函数。
代码:(此源码报错,注意甄别)
class Data{
public:int mA;
public:
#if 0//无参构造函数Data(){mA = 0;cout << "无参构造函数" << endl;}
#endif#if 1//有参构造函数Data(int a){mA = a;cout << "有参构造函数 ,mA = " << mA << endl;}
#endif
};void test02(){Data da1;cout << da1.mA <<endl;
}