/*
成员变量是别的类的对象
*/
#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