C++构造函数
构造函数
概念
构造函数
其实就是一个函数,只不过返回的是这个类的实例
所以,不允许用户设定它的返回值
提供
该函数有声明且有定义
编译器提供的默认构造函数
当且仅当没有提供任何构造函数时,编译器才会提供默认构造函数
功能 将成员变量初始化,如将string类型的成员变量置为"",把int类型的成员变量置为0,把指针置为nullptr
无参构造函数
如果用户声明了无参构造函数,那么默认构造函数会被"隐藏"
所以必须手动对成员变量初始化,否则,成员变量将是未知的值
有参构造函数
用户提供了有参构造函数就必须提供无参构造函数
否则,以下调用无参构造函数的语句会报错
Person person;
Person person = Person();
Person* p_person = new Person;
Person* p_person = new Person();
显式调用构造函数
通过返回值来返回类的实例
为 构造函数名+() 的形式 , 除此之外,全部都是隐式声明
隐式调用构造函数
根据显式调用的定义来确定
所有调用构造函数的形式
//===========创建对象===========
//隐式调用无参构造函数
Person person;
//隐式调用有参构造函数
Person person("virgil");
//显式调用无参构造函数
Person person = Person();
//显示调用有参构造函数
Person person = Person("name");
//========创建指针并分配内存==========
//隐式调用无参构造函数
Person* p_person = new Person;
//显式调用无参构造函数
Person* p_person = new Person();
//显式调用有参构造函数
Person* p_person = new Person("virgil");
//=========容易混淆============
Person person();//该语句创建了一个返回值为Person的函数,而不是想象的那样
总结
-
构造函数可以简单地分为两种类型
有参构造函数
无参构造函数
-
显式调用构造函数和隐式调用构造函数其实没必要认真区分,只要记住这几种常用的调用方法即可,特别注意不要混淆
Person person();
-
有参构造函数前要先实现无参构造函数
-
无参构造函数优先级高于默认构造函数
附上测试代码
#include <iostream>
#include <string>
using std::string;
using std::cout;
using std::endl;
class Person{
public:
string name;
//无参构造函数覆盖了默认构造函数
Person(){
name = "default";
}
//有参构造函数
Person(string _name){
name = _name;
}
void print(){
cout<<"name:"<<name<<endl;
cout<<endl;
}
};
int main() {
//===========创建对象===========
//隐式调用无参构造函数
Person person0;
person0.print();
//隐式调用有参构造函数
Person person1("virgil");
person1.print();
//显式调用无参构造函数
Person person2 = Person();
person2.print();
//显示调用有参构造函数
Person person3 = Person("name");
person3.print();
//========创建指针并分配内存==========
//隐式调用无参构造函数
Person* p_person1 = new Person;
(*p_person1).print();
//显式调用无参构造函数
Person* p_person2 = new Person();
(*p_person2).print();
//显式调用有参构造函数
Person* p_person3 = new Person("virgil");
(*p_person3).print();
//=========容易混淆============
Person person();//该语句创建了一个返回值为Person的函数,而不是想象的那样
return 0;
}