面向对象的程序设计学习笔记-16-使用this指针

来源:互联网 发布:mysql 数据表日志 编辑:程序博客网 时间:2024/05/16 02:17
/*
this指针的介绍:c++为每个类的成员函数都隐含定义了一个this指针。其格式是:  类名 *const this
this指针是作为隐含的参数自动传递给成员函数。调用哪个对象成员函数,this指针便指向那个对象。因此所有的成员函数都拥有this指针。
一般是不显式地使用this指针,有些场合则例外。例如在被调用的成员函数体内用“*this”来标识该对象。因为this指针指向了该调用的对象
,则this指针进行取内容运算的结果也就是该对象。
总之,当一个对象调用它所属类的成员函数时,则this指针便指向该对象,在成员函数体内,就不再修改它,直到该成员函数执行完。this指针才被
释放。
*/
#include<iostream>
#include <cstring>
using namespace std;
class person
{
public:
person(const char *ps);//类型转换构造函数。可以尝试下引用const
/*类型转换构造函数,把形参字符串指针ps所指向的字符串常量转换成person类的对象,并将该字符串常量存放在该
对象的私有数据中*/
person(person &p);//复制构造函数
void copy(person &p);//进行数据的拷贝
void print_name();//输出显示字符串
void print_pn();//输出显示字符串
private:
char name[20];
char *pn;
};
person::person(const char *ps)//类型转换构造函数const
{
static int k=0;//计算类型转换构造函数被调用的次数
cout<<"类型转换构造函数被调用,第"<<++k<<endl;
pn=new char[strlen(ps)+1];//使用指针来存放该地址
if(pn)
strcpy(pn,ps);
cout<<"另外的一种构建方法:"<<endl;
if(ps)
strcpy(name,ps);//把ps所指的(实参)字符串复制到该对象的字符串数组name中。
else
name[0]='\0';//置为空字符串
}
person::person(person &p)//进行深拷贝
{
cout<<"复制构造函数被调用!\n";
pn=new char[strlen(p.name)+1];
if(pn)
strcpy(name,p.name);//也是可以使用strcpy(pn,p.name)
strcpy(pn,p.name);//因为name和pn都进行赋值,所以在显式的时候,两种显式方法都可以得到相同的值
}
void person::copy(person &p)
{
/*cout<<"调用copy(函数)!\n";
cout<<"使用循环来实现字符串的复制:"<<endl;
int j=strlen(p.name)+1;
for(int i=0;i<=j;i++)
name[i]=p.name[i];*/


cout<<"使用this指针实现字符串的复制:"<<endl;
if(this==&p)
return;
/**判断this指针所指的对象,即调用copy成员函数的对象就是实参对象自己,
即自己复制自己,换言之通过一个对象p执行“p.copy(p)”,不做“位模式拷贝”操作,直接返回。
*/
strcpy(this->name,p.name);
/**若不是自己复制自己,则做“位模式拷贝”操作,将person类(实参)对象的唯一数据成员name复制到this指针所指的对象,
即调用copy()成员函数对象的数据*/
//使用指针来进行copy
cout<<"使用字符指针进行字符串的复制"<<endl;
pn=new char[strlen(p.name)+1];
strcpy(pn,p.name);//这语句似乎是可以通过的??
}
void person::print_name()
{
cout<<"使用name输出字符串:"<<name<<endl;
}
void person::print_pn()
{
cout<<"使用指针pn输出字符串:"<<pn<<endl;
}
void main()
{
person p0(""),p1("I love chi"),p2("me too");
//cout<<"before copying:\n";
//p0.print_name();p1.print_name();p2.print_name();
//p0.print_pn();p1.print_pn();p2.print_pn();
//p0=p1;p1=p2;//使用深拷贝赋值构造函数。
//cout<<"after 深拷贝:\n";
//p0.print_name();p1.print_name();p2.print_name();
//p0.print_pn();p1.print_pn();p2.print_pn();
////
//cout<<"使用copy()函数"<<endl;//copy函数中仅对name进行操作
//p0.copy(p2);
//p0.print_name();//输出的结果应该是me too
//p1.print_name();
//p0="";p1="I love chi",p2="me too";
p0.print_name();p1.print_name();p2.print_name();
p0.print_pn();p1.print_pn();p2.print_pn();
p0.copy(p1);p1.copy(p2);
p0.print_name();p1.print_name();p2.print_name();
p0.print_pn();p1.print_pn();p2.print_pn();
/*由于在copy函数内,仅仅对name进行操作,而未对pn进行操作
后来在copy函数中,加入了对pn的操作。其中跟拷贝构造函数很类似,即可以实现*/


}