/* 成员变量是别的类的对象 */ #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
原文地址:http://blog.csdn.net/love9099/article/details/43059235