• C++面向对象练习(一)—— 各种函数执行顺序


    概览:C++面向对象练习:构造函数、拷贝构造函数、重载赋值运算符以及析构函数的执行顺序。

    本文首发于我的个人博客www.colourso.top,欢迎来访。

    代码全部运行于VS2019

    博客后续会持续更新补充。

    各个函数执行顺序

    class Dog
    {
    public:
        Dog() 
        {
            cout << "默认构造函数" << endl;
        }
    
        Dog(int age) :age(age) 
        {
            cout << "有参构造函数" << endl;
        }
    
        Dog(const Dog& dog) :age(dog.age) 
        {
            cout << "拷贝构造函数" << endl;
        }
    
        Dog& operator=(const Dog& dog)
        {
            cout << "拷贝赋值运算" << endl;
            if(this == &dog)//自赋值
                return *this;
    
            this->age = dog.age;
            return *this;
        }
    
        ~Dog() 
        {
            cout << "析构函数" << endl;
        }
    
        void show()
        {
            cout << "--  "<<this->age <<"  --"<< endl;
        }
    
    private:
        int age;
    };
    
    void test0()
    {
        cout << "函数test0()开始执行" << endl;
        Dog d0;
        cout << "函数test0()结束执行" << endl;
    }
    
    void test1(Dog dd)
    {
        cout << "函数test1()开始执行" << endl;
        dd.show();
        cout << "函数test1()结束执行" << endl;
    }
    
    Dog test2(Dog& dd)
    {
        cout << "函数test2()开始执行" << endl;
        Dog tmp = dd;
        tmp.show();
        cout << "函数test2()结束执行" << endl;
        return tmp;
    }
    
    int main()
    {
        cout << "主函数main()开始执行" << endl;
        test0();
    
        Dog d1(12);
    
        Dog d2 = d1;
    
        Dog d3;
    
        d3 = d1;
        
        test1(d3);
    
        Dog d4;
    
        d4 = test2(d1);
    
        cout << "主函数main()结束执行" << endl;
    
        return 0;
    }
    

    执行结果如下:

    • 主函数main()开始执行

    • 函数test0()开始执行

    • 默认构造函数

    • 函数test0()结束执行

    • 析构函数

    • 有参构造函数

    • 拷贝构造函数

    • 默认构造函数

    • 拷贝赋值运算

    • 拷贝构造函数

    • 函数test1()开始执行

    • -- 12 --

    • 函数test1()结束执行

    • 析构函数

    • 默认构造函数

    • 函数test2()开始执行

    • 拷贝构造函数

    • -- 12 --

    • 函数test2()结束执行

    • 拷贝构造函数

    • 析构函数

    • 拷贝赋值运算

    • 主函数main()结束执行

    • 析构函数

    • 析构函数

    • 析构函数

    • 析构函数

    d4 = test2(d1)在函数值返回时注意!

    Dog test3()
    {
        cout << "函数test3()开始执行" << endl;
        Dog tmp(10);
        cout << "函数test3()结束执行" << endl;
        return tmp;
    }
    
    int main()
    {
        cout << "主函数main()开始执行" << endl;
    
        Dog d5 = test3();
        
        cout << "--------" << endl;
    
        test3();
    
        cout << "主函数main()结束执行" << endl;
    
        return 0;
    }
    

    结果为:

    • 主函数main()开始执行
    • 函数test3()开始执行
    • 有参构造函数
    • 函数test3()结束执行
    • 拷贝构造函数
    • 析构函数
    • --------
    • 函数test3()开始执行
    • 有参构造函数
    • 函数test3()结束执行
    • 拷贝构造函数
    • 析构函数
    • 析构函数
    • 主函数main()结束执行
    • 析构函数

    当函数返回一个对象的时候,所作的操作为匿名对象 = return tmp,这样就会执行拷贝构造函数,然后tmp析构。

    而若是函数返回的匿名对象没有值进行接受的话,匿名对象会立刻进行析构。而若是有值进行接受的话,匿名对象就会转正,不会触发任何函数。


    C++面向对象练习

    试定义一个处理学生信息的类Student。该类包含学号、成绩和姓名等数据成员( 学号不能相同)以及
    若干成员函数,另外定义全局函数max),返回n个学生成绩最高者。

    具体要求如下:

    (1)私有数据成员

    int num,score; num存放学号,score 存放成绩

    char name[9]; name 存放学生的姓名

    (2)公有成员函数

    构造函数:将学号、成绩设置为0,姓名设置为空

    void Set(int id,char *na,int sc );为数据成员赋值。

    int get_ score();返 回学生成绩。

    void print();输出学生的学号、姓名和成绩。

    (3) Student max(Student *,int n);全局函数,求得并返回s所指向的n个学生中成绩最高者。

    int check_num(Student str[],int n,int num);检查学号是否已经在str中存在返回1,否则返回0。

    (4)在主函数中完成对该类的测试,主函数中定义一个长度为3的Student类的对象数组s,依次键入学号、成绩、姓名;注意,在输入每-一个学生的信息后,要判断所输入的学号是否已存在,如果存在,则要求重新输入该学生的信息。最后调用全局函数max(,得到成绩最高的学生信息并输出。

    参考链接: C++面向对象程序设计50道编程题(第21题)

    /*测试环境: VS2019*/
    #include <iostream>
    
    using namespace std;
    
    class Student
    {
    public:
        Student();
        ~Student();
    
        void Set(int id, char* na, int sc); //为数据成员赋值
        int get_score();                    //返回学生成绩
        int get_num();                      //返回学生学号
        void print();                       //输出学生的学号、姓名、成绩
    
    private:
        int num;        //学号
        int score;      //成绩
        char name[9];   //姓名
    };
    
    Student max(Student*, int n);				//求得并返回n个学生中成绩最高的
    int check_num(Student stu[], int n,int num);//检查学号是否已经在stu中
    
    int main()
    {
        Student stu[3];
        int input_num;
        int input_score;
        char input_name[9];
        int i = 0;
        while(1)
        {
            cout << "请输入学生的学号" << endl;
            cin >> input_num;
            if (check_num(stu, i, input_num) == 1)
            {
                cout << "已经存在,请重新输入" << endl;
                continue;
            }
            
            cout << "请输入学生的成绩" << endl;
            cin >> input_score;
    
            cout << "请输入学生的姓名" << endl;
            cin >> input_name;
    
            stu[i].Set(input_num, input_name, input_score);
    
            cout << "信息录入成功" << endl;
    
            i++;
    
            if (i >= 3) break; 
        }
    
        cout << "学生信息如下:" << endl;
        for (i = 0; i < 3; i++)
        {
            stu[i].print();
        }
    
        cout << "成绩最高的学生信息如下:" << endl;
        max(stu, 3).print();
    
        return 0;
    }
    
    Student::Student()
    {
        this->num = 0;
        this->score = 0;
        strcpy_s(this->name,"");
    }
    
    Student::~Student()
    {
    
    }
    
    void Student::Set(int id, char* na, int sc)
    {
        this->num = id;
        this->score = sc;
        strcpy_s(this->name, na);
    }
    
    int Student::get_score()
    {
        return this->score;
    }
    
    int Student::get_num()
    {
        return this->num;
    }
    
    void Student::print()
    {
        cout << "Name: " << this->name << ": id:" << this->num
            << ", score: " << this->score << endl;
    }
    
    Student max(Student* stu, int n)
    {
        int max = 0;
        int max_score = stu[0].get_score();
    
        for (int i = 1; i < n; i++)
        {
            if (max_score < stu[i].get_score())
            {
                max_score = stu[i].get_score();
                max = i;
            }      
        }
        return stu[max];
    }
    
    int check_num(Student stu[], int n, int num)
    {
        for (int i = 0; i < n; i++)
        {
            if (stu[i].get_num() == num)
            {
                return 1;
            }
        }
        return 0;
    }
    

    本文首发于我的个人博客www.colourso.top,欢迎来访。

  • 相关阅读:
    css dropdown menu
    Understanding Delegated JavaScript Events
    AngularJS-Learning ui-router angular-transitions
    javascript sorting/ v8 sorting
    Sublime Text 3 新手上路:必要的安裝、設定與基本使用教學
    express with bower in websotrm
    angularjs transitions
    create a nodejs npm package
    nodejs module/require
    stylus , another css processor
  • 原文地址:https://www.cnblogs.com/colourso/p/12693152.html
Copyright © 2020-2023  润新知