#include<iostream> #include<stdlib.h> using namespace std; /************************************************************ * demo1.cpp 中类的数据成员(m_iLen)与成员函数的参数(len)不重名 * *********************************************************/ class Array{ public: Array(int len); //构造函数 ~Array(); //析构函数 void setLen(int x); int getLen(); void printfInfo(); private: int m_iLen; }; Array::Array(int len){ m_iLen = len; } Array::~Array(){ } void Array::setLen(int len){ m_iLen = len; } int Array::getLen(){ return m_iLen; } void Array::printfInfo(){ cout << "m_iLen = " << m_iLen << endl; } /****************** 测试主函数 ******************************/ int main(){ Array arr1(4); cout << arr1.getLen()<<endl; arr1.printfInfo(); system("pause"); return 0; }
4 m_iLen = 4
#include<iostream> #include<stdlib.h> using namespace std; /************************************************************ * demo2.cpp 中类的数据成员(Len)与成员函数的参数(len)重名 !!! 运行错误 * *********************************************************/ class Array{ public: Array(int len); //构造函数 ~Array(); //析构函数 void setLen(int x); int getLen(); void printfInfo(); private: int len; //数据成员(Len)与成员函数的参数(len)重名 }; Array::Array(int len){ len = len; //编译器会疑惑是将参数赋值给数据成员,还是将数据成员赋值给参数 } Array::~Array(){ } void Array::setLen(int len){ len = len; } int Array::getLen(){ return len; } void Array::printfInfo(){ cout << "len = " << len << endl; } /****************** 测试主函数 ******************************/ int main(){ Array arr1(4); cout << arr1.getLen()<<endl; arr1.printfInfo(); system("pause"); return 0; } /******************************* 运行结果(错误): 4201131 len = 4201131 *******************************/
4201131 len = 4201131
#include<iostream> #include<stdlib.h> using namespace std; /************************************************************ * demo3.cpp 使用this指针解决数据成员(Len)与成员函数的参数(len)重名的问题,运行结果正确 * *********************************************************/ class Array{ public: Array(int len); //构造函数 ~Array(); //析构函数 void setLen(int x); int getLen(); void printfInfo(); private: int len; //数据成员(Len)与成员函数的参数(len)重名 }; Array::Array(int len){ this->len = len; // 添加this指针 ,编译器不会再疑惑是将参数赋值给数据成员,还是将数据成员赋值给参数 } Array::~Array(){ } void Array::setLen(int len){ this->len = len; // 添加this指针 } int Array::getLen(){ return len; } void Array::printfInfo(){ cout << "len = " << len << endl; } /****************** 测试主函数 ******************************/ int main(){ Array arr1(4); cout << arr1.getLen()<<endl; arr1.printfInfo(); system("pause"); return 0; }
4 len = 4
修改函数printfInfo():
在函数printfInfo()的声明和定义中,将返回类型改为Array,并在printfInfo()的定义中返回this指针 ,事实上返回类型后面需要加&或*,后面再讲到。
int printfInfo(){ cout << "len = " << m_iLen << endl; }
修改为:
Array Array::printfInfo(){ // 修改printfInfo()函数的返回值为Array cout << "len = " << len << endl; return *this; // 返回this指针 }
由于函数printfInfo()返回了this指针,所以理论上语句 arr1.printfInfo().setLen(8) 相当于arr1.setLen(8) ,也就是该语句修改数据成员len为8,测试主函数如下:
int main(){ Array arr1(4); arr1.printfInfo().setLen(8); //printfInfo()函数中返回了arr1对象的this指针,这里相当于arr1.setLen(8) cout << arr1.getLen()<<endl; //检查上一条语句是否修改了数据成员len的值,运行结果发现len的值并没有改变, 为什么呢? return 0; }
len = 4 4
#include<iostream> #include<stdlib.h> using namespace std; /************************************************************ * demo4.cpp this指针的特殊用法,修改成员函数 printfInfo()的返回类型,返回this指针 * *********************************************************/ class Array{ public: Array(int len); ~Array(); void setLen(int x); int getLen(); Array& printfInfo(); //修改printfInfo()函数的返回类型为Array,并加 & private: int len; //数据成员(Len)与成员函数的参数(len)重名 }; Array::Array(int len){ this->len = len; // this指针 } Array::~Array(){ } void Array::setLen(int len){ this->len = len; //this指针 } int Array::getLen(){ return len; } Array& Array::printfInfo(){ // 修改printfInfo()函数的返回值为Array,并加 & cout << "len = " << len << endl; return *this; // 返回this指针 } /****************** 测试主函数 ******************************/ int main(){ Array arr1(4); arr1.printfInfo().setLen(8); //修改数据成员len cout << arr1.getLen()<<endl; //检查上一条语句是否修改了数据成员len的值 system("pause"); return 0; }
len = 4 8
Array& Array::setLen(int len){ this->len = len; //this指针 return *this; }
测试主函数:
int main(){ Array arr1(4); arr1.printfInfo().setLen(8).printfInfo(); //setLen()后面直接调用其他成员函数 //cout << arr1.getLen()<<endl; //不需要该语句了 return 0; }
运行结果:
len = 4 len = 8
#include<iostream> #include<stdlib.h> using namespace std; /************************************************************ * demo6.cpp this指针的特殊用法 把引用修改为指针 * *********************************************************/ class Array{ public: Array(int len); ~Array(); Array* setLen(int x); //函数的返回类型为Array ,并加指针 int getLen(); Array* printfInfo(); //函数的返回类型为Array ,并加指针 private: int len; //数据成员(Len)与成员函数的参数(len)重名 }; Array::Array(int len){ this->len = len; // this指针 } Array::~Array(){ } Array* Array::setLen(int len){ this->len = len; //this指针 return this; } int Array::getLen(){ return len; } Array* Array::printfInfo(){ // 修改printfInfo()函数的返回值为Array,并加指针 cout << "len = " << len << endl; return this; // 返回this指针,这里不需要星号了 } /****************** 测试主函数 ******************************/ int main(){ Array arr1(4); //arr1.printfInfo().setLen(8).printfInfo(); arr1.printfInfo()->setLen(8)->printfInfo(); //改成指针的调用方式 system("pause"); return 0; }
len = 4 len = 8