• C++学习7 构造函数


    当创建一个对象时,往往需要做一些初始化工作,例如对数据成员赋值等。为了解决这个问题,C++提供了构造函数。

    构造函数(Constructor)是一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户调用(用户也不能调用),而是在创建对象时自动执行。构造函数的作用是在创建对象时进行初始化工作,最常见的就是对成员变量赋值。

    一个构造函数的例子:

    #include <iostream>
    using namespace std;
    class Student{
    private:
        char *name;
        int age;
        float score;
    public:
        //声明构造函数
        Student(char *, int, float);
        //声明普通成员函数
        void say();
    };
    //定义构造函数
    Student::Student(char *name1, int age1, float score1){
        name = name1;
        age = age1;
        score = score1;
    }
    //定义普通成员函数
    void Student::say(){
        cout<<name<<"的年龄是 "<<age<<",成绩是 "<<score<<endl;
    }
    int main(){
        //根据构造函数创建对象
        Student stu("小明", 15, 90.5f);  //传参形式类似于函数调用
        stu.say();
        return 0;
    }

    在类中我们定义了一个构造函数 Student(),它的作用是给3个 private 属性的成员变量赋值。在 main 函数中,我们根据构造函数创建了一个对象 stu;因为构造函数有参数,所以创建对象时要相应地传入实参,形式类似于函数调用。

    读者要注意:一旦在类中定义了构造函数,那么创建对象时一定会被执行;如果构造函数有参数,创建对象时就要传参。

    另外,构造函数主要用来进行初始化,没有返回值(有返回值没有任何意义),这就意味着:

    • 不管是声明还是定义,函数名前面都不能出现返回值类型,即使是 void 也不允许;
    • 函数体中不能有 return 语句。

    默认构造函数

    如果用户自己没有定义构造函数,那么编译器会自动生成一个默认的构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行任何操作。比如上面的 Student 类,默认生成的构造函数如下:

    一个类,必须有构造函数,要么用户自己定义,要么编译器自动生成。一旦用户自己定义了构造函数,不管它是 public 属性的,还是 private、protected 属性的,编译器都不再自动生成。上面的 Student 类,只有一个构造函数,就是我们自己定义的。

    构造函数的重载

    和普通成员函数一样,构造函数是允许重载的。一个类可以提供多个构造函数,让用户在创建对象时进行选择,编译器会根据创建对象时传递的参数来确定调用哪一个构造函数。也就是说:

    • 只有一个构造函数会被执行;
    • 创建对象时提供的参数必须和其中的一个构造函数匹配,否则编译错误。
    #include <iostream>
    using namespace std;
    class Student{
    private:
        char *name;
        int age;
        float score;
    public:
        //声明构造函数
        Student();
        Student(char *, int, float);
        //声明普通成员函数
        void setname(char *);
        void setage(int);
        void setscore(float);
        void say();
    };
    //定义构造函数
    Student::Student(){}
    Student::Student(char *name1, int age1, float score1){
        name = name1;
        age = age1;
        score = score1;
    }
    //定义普通成员函数
    void Student::setname(char *name1){
        name = name1;
    }
    void Student::setage(int age1){
        age = age1;
    }
    void Student::setscore(float score1){
        score = score1;
    }
    void Student::say(){
        cout<<name<<"的年龄是 "<<age<<",成绩是 "<<score<<endl;
    }
    int main(){
        //创建对象时初始化成员变量
        Student stu1("小明", 15, 90.5f);
        stu1.say();
       
        //调用成员函数来初始化成员变量的值
        Student stu2;
        stu2.setname("李磊");
        stu2.setage(16);
        stu2.setscore(95);
        stu2.say();
        return 0;
    }

    类中定义了两个构造函数,一个带参数一个不带参数,它们是重载关系。当根据不带参数的构造函数创建对象时,不需要传参,成员变量不会被初始化,所以要调用成员函数来设置它们的值。

  • 相关阅读:
    windows快捷键
    android录音实现不再担心—一个案例帮你解决你的问题
    区块链到底是个什么鬼?一幅漫画让你秒懂!
    10个优秀个android项目,精选|快速开发
    精文推荐,12个开源项目开发必备,绝对干货
    送书拉! 08年新开始|福利近在咫尺
    用Kotlin破解Android版微信小游戏-跳一跳
    聊一聊正则表达式,最全最常用总结
    11个优秀的Android开发开源项目
    一招教你打造一个滑动置顶的视觉特效
  • 原文地址:https://www.cnblogs.com/Caden-liu8888/p/5791660.html
Copyright © 2020-2023  润新知