• 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;
    }
    
  • 相关阅读:
    MERGE引擎 分表后 快速查询所有数据
    MYSQL导入中文数据乱码的四种解决办法
    数据库中为什么不推荐使用外键约束?
    Word转PDF
    YII2 更新数据不成功
    YII2 使用curl请求,返回false
    Yii集成PHPWord
    网站安全DDOS攻击及监测
    nginx日志
    定时任务秒级执行
  • 原文地址:https://www.cnblogs.com/virgildevil/p/11911213.html
Copyright © 2020-2023  润新知