`
java-mans
  • 浏览: 11511926 次
文章分类
社区版块
存档分类
最新评论

this指针的使用

 
阅读更多

当我们调用一个类对象的时候,就会有一个this指针与调用成员函数的对象绑定在一起。虽然成员函数可以显式的使用这个指针,但是一般在什么时候使用呢?
当我们需要使用这个类的整体而不是其中的某个成员时,就需要this指针了。最常见的情况,就是一个函数返回调用该函数对象的引用:

char Screen::get(index n,index c)const

{
	index row = n * width;
	return contents[row + c];
}

inline Screen::index Screen::get_cursor()const
{
	return cursor;
}

Screen& Screen::set(char c)
{
	contents[cursor] = c;
	return *this;
}

Screen& Screen::move(index r,index c)
{
	if(r >= height || c >= width)
	{
		cerr<<"invalidate row or column"<<endl;
		throw EXIT_FAILURE;
	}
	
	index row = r * width;
	cursor = row + c;
	return *this;
}


这样的话,就可以这样调用函数了:这样的话,就可以这样调用函数了:这样的话,就可以这样调用函数了:

myScreen.move(4,5).set('#');

有一点需要特别留心,对于普通函数,this指针是一个指向类类型的const指针(这个指针始终指向调用成员函数的类,但是这个类的成员是可以修改的),但如果这个函数是const函数,那么那么这个指针是指向const类类型的const指针:既不能改变指向,也不能改变这个类的成员的大小。
这就出现了一个问题,比如我们定义了一个display函数来显示内容,按理说,这个函数时const函数,但是如果这样定义,那么如果返回它的指针就是指向const类类型的const指针,那么如果我们按照前面的方式使用,就会出错:

myScreen.display(cout).set('*');

因为函数的返回值是指向const类类型的const指针,不能调用非const函数。
一种比较好的解决方法,就是定义display的重载函数,当我们单独使用时,调用的是const版本,否则调用的是非const版本。

Screen& Screen::display(ostream &os)
{
	do_display(os);
	return *this;
}

const Screen& Screen::display(ostream &os)const
{
	do_display(os);
	return *this;	
}


void Screen::do_display(ostream& os)const
{
	string::size_type index = 0;
	while(index != contents.size())
	{
		os<<contents[index];
		if(((index + 1) % width )== 0)
		{
			os<<'\n';
		}
		++index;
	}	
}


这两个函数仅在函数类型上有差别,所以我单独定义了一个do_display函数来完成函数的实际功能,这样做的好处其实很多:

1.这样不必编写重复的代码。

2.假如我们要修改显示的具体操作,只用修改do_display一处就可以了。尤其是,在do_display加入一些开发阶段经常使用的调试信息,当最终版本形成时,只用在这一个函数里删除调试信息即可。

3.如果我们把do_display定义成内联函数,那么与重复的写这些代码相比,这个函数调用过程并不会增加任何性能的开销。

分享到:
评论
1 楼 lipache 2013-03-17  
博主您好,对于您写的两个重载函数定义:

Screen& Screen::display(ostream &os)

const Screen& Screen::display(ostream &os)const

我存在疑问。编程验证了一下运行结果是无论单独使用myScreen.display(cout);还是使用

语句myScreen.display(cout).set('#');均调用非const版本,并没有调用重载的const

版本,与您描述不符。重载现象只出现在声明一个const class myScreen1, 并用

myScreen1.display(cout)调用时。以我的理解,重载成员函数后加const只是起到一个重载

参考作用,如果声明的不是const class,由于在这个程序里do_display()本身就不修改类成

员,编译器调用哪一个display()函数效果都是一样的,但它优先调用限制较少的非const版

本,以下是我的程序代码,望您给予回复,谢谢!

#include<stdlib.h>
#include <iostream>
#include<string>

using namespace std;
class Screen
{
public:

const Screen& display(ostream &os)const;
Screen& display(ostream &os);
Screen& set(char c);
private:
void do_display(ostream& os,string k)const;
char content;
};
        Screen& Screen::display(ostream &os)
    { 
        do_display(os,"non-const version"); 
        return *this; 
    } 

     
    const Screen& Screen::display(ostream &os)const 
    { 
        do_display(os,"const version"); 
        return *this;    
    } 
     
     
    void Screen::do_display(ostream& os,string k)const 
    { 
        os<<k<<endl;
    } 
  
Screen& Screen::set(char c) 
   { 
     this->content=c;
    return *this; 
   } 
     
    int main(int argc, char* argv[]) 
    { 
Screen myScreen;
const Screen myScreen1;
myScreen.display(cout);
myScreen.display(cout).set('#');
myScreen1.display(cout);

system("pause");

return 0;
    } 

相关推荐

    C++中this指针的用法

    C++中this指针的用法C++中this指针的用法C++中this指针的用法C++中this指针的用法C++中this指针的用法C++中this指针的用法C++中this指针的用法C++中this指针的用法C++中this指针的用法

    m_hWnd和this指针

    this指针的使用场景包括: * 在类的非静态成员函数中返回类对象本身的时候,直接使用return *this; * 为避免对同一对象进行赋值操作,例如在重载运算符"="时,如:ClassText& operator = (const ClassText& ...

    C#this指针用法

    简单介绍了C#中this指针的用法。

    高手详解javascript中的this指针

    高手详解javascript中的this指针

    Java中的this指针使用方法分享

    我知道很多朋友都和我一样:在JAVA程序中似乎经常见到“this”,自己也偶尔用到它,但是到底“this”该怎么用,却心中无数!很多人一提起它,就说“当前对象”,可到底什么是当前对象,是什么当前对象,他自己也不...

    C++this 指针精讲

    精讲C++中this指针的用法,一学就会的、

    详解C++中的this指针

    详解C++中的this指针 关于this指针的详细的解释,不明白的可以看看

    详解Javascript 中的this指针

    详解Javascript 中的this指针

    this指针的使用.zip

    this指针的使用

    MFC窗口m_hWnd和this指针

    介绍MFC窗口m_hWnd和this指针的区别

    C this指针应用简单一例.rar

    C this指针应用简单一例,使用this指针编写程序实现对象资源的拷贝。①分配新的堆内存,②完成值的复制,调用资源复制函数。

    深入探讨C++的this指针

    this指针作为一个隐含参数传递给非静态成员函数,用以指向该成员函数所属类所定义的对象

    模拟C++的this指针.....

    给出了模拟C++中的this指针的方法,挺好用的,保证你能够学到东西..

    C++ this指针的理解

    比较好的this讲解 方便初学者学习 可以更好理解 比较易懂

    原创:this指针探秘

    原创:this指针探秘原创:this指针探秘原创:this指针探秘原创:this指针探秘

    C++ this 指针的用法及注意

    当你进入一个房子后,  你可以看见桌子、椅子、地板等,  但是房子你是看不到全貌了。  对于一个类的实例来说,  你可以看到它的成员函数、成员变量, ... this是一个指针,它时时刻刻指向你这个实例本身

    C++this详解.txt

    C++this指针常用概念,this指针的使用,this例子,this指针如何传递给类中函数

Global site tag (gtag.js) - Google Analytics