1.什么是构造函数?
一种特殊的成员函数,创建一个对象时,系统需要调用对象的构造函数进行初始化,类似于OC的init方法
2.构造函数的特点
- 函数名与类名一样,书写格式:类名(参数列表)
- 没有返回值,加上void也不行
- 每个类都有一个默认的公共的无参构造函数,但只要额外增加了一个构造函数,系统将不提供默认的空构造函数
- 构造函数可以重载,也就是说,可以提供多个构造函数
3.构造函数的其他知识点
如果对象是一个全局变量,那么它的构造函数调用会先于main函数
4.什么是转换构造函数
- 带有一个参数的构造函数
- 可以将其他类型的数值转为对象
例如:Person p(20);//前提是需要提供下面的构造函数
直接调用转换构造函数:Person(int age)
如果是一下代码需要分情况讨论
Person p;
p = 30;
如果Person类重载了=(int)运算,第二句代码会直接用重载过的运算符进行运算
如果没有重载,则::先隐式调用转换构造函数:Person(int age)产生一个临时的Person对象,再将临时对象赋值给p{实现是调用operator=(const Person& other)函数
执行语句:Person temp(30);p.operator = (temp);
}
-------这种情况下会调用两次构造函数,第一句调用空构造函数,第二句调用转换构造函数,这种调用称为隐式调用
5.如何阻止转换构造函数的隐式调用?
只需要在声明只有一个参数的构造函数上加上explicit关键字(明显的)例如:
explicit Person(int age);
P.S.--C++创建对象数组和释放对象数组的一些问题
Person persons[2] = {20,30}; //会调用两次转换构造函数
Person *persons = new Person[2];//persons指向数组的第一个元素
Person *persons = new Person[2]{20,30};跟上面一条语句一样,多了调用转换构造函数的过程
第一种创建方法创建出来的对象数组在栈里面,不需要我们手动管理,第二\三种方发创建的对象在堆里,需要手动释放
而且释放对象数组的时候,应该用指向首元素的指针去释放,跟释放对象不一样,还要加上方括号,例如:
delete [] persons;