首页 > 代码库 > C++ 成员变量是别的类的对象

C++ 成员变量是别的类的对象


?在成员函数中,可以将this指针当参数传递,也可以返回this指针,或返回通过this指针拿到的对象

/*
 成员变量是别的类的对象
 */

#include <iostream>
using namespace std;

//日期类
class Date {
    int year,month,day;
public:
    //构造方法
    Date(){
        cout << "Date() " << endl;
    }
    //有参
    Date(int _y,int _m,int _d):year(_y),month(_m),day(_d){
    }
    //
    void setValue(int year,int month,int day){
        this -> year = year;
        this -> month = month;
        this -> day = day;
        
    }
};


//员工类
class Employee{
    string name;//C++的字符串
    int age;
    Date bir;
public:
    Employee (string name,int age){
        cout << "员工的构造方法" << endl;
    //创建对象的最后一步是调用构造方法。只要开辟了内存空间,这个对象就有了,也就是说在构造方法里面有this指针
        this->name = name;
        this->age = age;
    }
    
    void show(){
        cout << name << "今年" << age << "岁了" << endl;
    }
    
    //员工的年龄可以增长。这个函数返回年龄 增长后的员工对象
    Employee growUp(){
        cout << "过了一年之后" << endl;
        age++;
        return *this;//this是指向当前对象的指针。而我要返回的是当前对象.所以把指针指向的那个值取出来就可以了
    }
    
    
    Employee& growUp2(){
        cout << "过了一年之后" << endl;
        age++;
        return *this;
    }
};




//主函数
int main(){
    //接下来我要创建一个员工   那么就1.会开辟内存空间,2.初始化变量(如果成员变量是对象,构建它。在创建这个变量的时候,要创建一个对象。也就是创建一个Date对象会调用它的构造方法。这个变量创建完以后才会调用员工类自己的构造方法,也就说是创建时机:对象变量的构造方法一定在员工类的构造方法之前调用),3.调用构造方法
    
    Employee em("张三",19);//执行到这行代码的时候,在程序中做了什么事情?
    em.show();
    
    em.growUp();//有人就会问了,你这个函数的返回值没有意义啊。返回void也是一样的
    em.show();
    
    
#pragma 现在问题来了。我想让年龄可以一直增长,不用多次写 em.growUp();   想让它满足这样的语法  em.growUp().growUp().growUp().growUp();  //那么em.growUp()之后得到的还是这个对象,这样就可以继续.growUp()....如果你这个函数返回空,那么就不能这样写了
    
    em.growUp().growUp().growUp().growUp();
    em.show();
#pragma 问题 --- 为什么调用4次不是24呢?
    
    /*******  注意 这是对象的值传递 ********/
    /*
    em.growUp()调用函数的时候em本身传进来了,函数体里面this->age++;这个age是当前对象em的成员变量,然后把em这个对象返回出去,在返回之前是21了。可是要注意返回的时候
    Employee growUp(){...return *this};  相当于 Employee = *this growUp(){..}
    这样得到的实际上是一个新的对象了不是em本身。
    
    通过当前对象创建一个新的对象返回出去,也就是说em.growUp()....返回的类型是员工类型,但不是em对象本身,是一个新的对象,新的对象去自增,跟em没有关系。也就是说em只有在第一次调用的时候增长过一次
    */
    
    
#pragma mark - 如果把方法的返回值改成返回引用试试
    cout << "年龄增长的函数返回值是引用类型的" << endl;
    em.growUp2().growUp2().growUp2().growUp2();
    em.show();
    
    
    /******  返回值改成返回引用  ******/
    /*
    Employee& = *this growUp(){...return *this};
    这样是把em本身返回出去了,也就是说第一个em.growUp2()调用完的到的是增长完的em本身。然后一直调用返回的都是em本身。。。

     */
    
    return 0;
}



/* Employee em("张三",19);//执行到这行代码的时候,在程序中做了什么事情?
 ************ 整个创建对象的流程  ************
 
 第一步开辟内存空间
 这个对象占多大空间?得看成员变量
 实际上占这么大
 string name;
 int age;
 Date bir;//而这个变量是日期对象,它到底多大?又得看日期类的成员变量。它里面有三个成员变量
 int year,month,day;
 
 第二步初始化成员变量(这是在构造方法调用之前)。如果成员变量是对象,那就构建它。
 
 第三步调用本类的构造方法。
 
 */


运行结果如下:

Date() 
员工的构造方法
张三今年19岁了
过了一年之后
张三今年20岁了
过了一年之后
过了一年之后
过了一年之后
过了一年之后
张三今年21岁了
年龄增长的函数返回值是引用类型的
过了一年之后
过了一年之后
过了一年之后
过了一年之后
张三今年25岁了
Program ended with exit code: 0



C++ 成员变量是别的类的对象