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;
}
posted @ 2019-11-22 14:12  virgil_devil  阅读(195)  评论(0编辑  收藏  举报