虚基类的声明是用在指定派生类时,放在派生类名的后面。该指针被称为虚基类指针。解:上述程序中,各类之间构成类层次如图6.14所示,其中虚线表示是虚继承,也就是说,其基类为虚基类。......
2023-11-07
类的每一个成员函数都有一个隐含的特殊指针,通常称为this指针,this指针的类型就是成员函数所属的类型。该指针是一个指向正在被某个成员函数操作的对象的指针。
当一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,也就是说,当调用成员函数时,this被初始化为被调用的成员函数所在的类实例即对象的地址,然后调用成员函数,每次成员函数存取数据成员时,则隐含使用this指针。通常不显式使用this指针。
this指针是C++实现封装的一种机制,它将对象和该对象调用的成员函数连接在一起,在外部看来,每个对象都拥有自己的成员函数。
【例2.20】分析以下程序的执行结果。
解:程序执行结果如下:
n=8
n=17
上述程序中,MyClass10类定义了一个addvalue非静态成员函数。在调用它时,需要写成:
MyClass10 s;
s.addvalue(9);
就是说,需要告诉系统是将s对象的私有数据成员n增大9,而不是其他对象。它实际上相当于以下函数调用:
addvalue(&s,9);
即将类对象的地址作为第一个参数传递给了函数。addvalue函数的原型是:
void addvalue(MyClass10*this,intm);
该函数的第一个参数是指向该类对象的一个指针即this指针。我们在定义该成员函数时并没有看到这样一个参数,因为这个参数是系统隐含的。在成员函数的定义体中,可以通过this访问这个地址参数。
实际上,s.addvalue(9)语句的执行过程如图2.11所示,先创建s1对象,将s1对象的n值增大m,再执行*this=s1,等同于s=s1,从而达到将s对象的n增大m的目的。如果了解了this指针的用法,上述MyClass10类的addvalue()成员函数可以等同地改写为:
如果不用this指针,该成员函数等同于以下代码:(www.chuimin.cn)
从上面分析看到,this指针增加了代码的复杂性。本例只是为了讲述this指针而这样设计的,在实际编程中,只有在确实需要时才使用this指针。
图2.11 this指针指向s对象
注意:this指针只能在类的成员函数中使用,它指向该成员函数被调用的对象。this指针一般用于返回当前对象自身。由于this指针始终指向调用对象,因此不能在静态成员函数的定义中使用this指针。静态成员函数一般都不需要调用对象,因此也就没有this指针。
【例2.21】分析以下程序的执行结果。
上述程序中,MyClass11类的add成员函数中使用了this指针,this指针指向当前对象自身,该成员函数中的语句:
this->n=s1.n+s2.n;
用于修改当前对象的数据成员的n值,语句:
return(*this);
返回当前对象自身,即对当前对象进行了修改。对于main()函数的调用add()成员函数语句:
s3.add(s1,s2);
this指针指向的就是s3,执行该语句之前s3的数据成员n未赋值,执行完该语句后,就修改了s3的私有成员的n值,使其为3。程序的执行结果如下:
s1∶n=2
s2∶n=1
s3∶n=3
this指针大量用于运算符重载成员函数设计中,这将在后面详细介绍。
注意:静态成员函数没有this指针。因为类只有一个静态成员函数实例,所以使用this指针没有什么意义。在静态成员函数中使用this指针会引起编译错误。
有关C++程序设计基础教程的文章
虚基类的声明是用在指定派生类时,放在派生类名的后面。该指针被称为虚基类指针。解:上述程序中,各类之间构成类层次如图6.14所示,其中虚线表示是虚继承,也就是说,其基类为虚基类。......
2023-11-07
指针初始化有几种方式:指针对象可以被一个具有相同类型的对象初始化。下面的例子将整型指针ip赋给另一整型指针ip2:int*ip2=ip;此时,这两个指针指向同一内存空间,可用图1.8表示。图1.8指针与指针所指对象如果程序员想强制赋给指针另一种类型变量的地址,则必须显式进行类型转换。如要将一个整型指针的值赋给浮点数指针,可以采用以下语句:float*fp=ip;通过直接分配内存地址得到初值。......
2023-11-07
在C++中,数组和指针密切相关,几乎可以互相使用。数组名字可以认为是常量指针,它指向存放数组第一个元素的内存地址。指针可以用于完成任何涉及数组下标的操作。实际上,数组下标表示法在编译期间将转换为指针表示法,所以用指针方式来书写数组下标表达式可以节省编译时间。如果再定义一个字符指针:char*pname=name;则name[i]、*和*具有相同的值,都是数组第i+1个元素的值。分析以下程序的执行结果。......
2023-11-07
程序设计是指设计、编写和调试程序的方法与过程。由于程序是软件的本体,因此软件的质量主要通过程序的质量体现,因此,研究一种切实可行的程序设计方法至关重要。继承是面向对象程序设计方法的一个重要标志,利用继承机制可以大大提高程序的可重用性和可扩充性。......
2023-11-07
需要注意的是,基类指针虽然获取了派生类对象的地址,但只能访问派生类从基类继承的成员,不能访问派生类中新增的成员,除非对基类指针强制类型转换调用派生类的成员函数。......
2023-11-07
声明函数模板的一般格式如下:template<模板参数表>函数返回值类型函数模板名(形参表)函数模板定义由关键字template开头,表示声明一个模板。模板参数表写在尖括号<>中,参数一般由关键字class或typename后加一个标识符构成。Class和typename的意义相同,表示后面的标识符是一个参数类型,代表一个潜在的标准类型或用户定义的类型。例如,定义max函数模板求两个数中的较大者。如下面的声明是错误的:可以看出,用函数模板比函数重载更方便,程序更简洁。......
2023-11-07
在类声明中,public、private和protected是关键字,称为成员访问限定符,它们分别表示公有、私有和保护的成员访问权限。其他函数不能访问该类的保护数据成员,也不能调用该类的保护成员函数。◇一旦给出了成员访问限定符,它后面的成员都具有这个成员访问权限,直到出现另一个成员访问限定符或类声明结束为止。类的成员函数可以访问类的所有成员,没有任何限制,而类的对象对类的成员的访问是受成员访问控制符制约的。......
2023-11-07
多态从实现的角度来讲可以划分为两类:编译时的多态和运行时的多态。按照绑定进行阶段的不同,可以分为两种不同的绑定方法:静态绑定和动态绑定,这两种绑定过程中分别对应着多态的两种实现方式。有些多态类型,其同名操作的具体对象能够在编译、连接阶段确定,通过静态绑定解决,比如重载、强制和参数多态。包含多态操作对象的确定就是通过动态绑定完成的。分析以下程序的执行结果。......
2023-11-07
相关推荐