指针初始化有几种方式:指针对象可以被一个具有相同类型的对象初始化。下面的例子将整型指针ip赋给另一整型指针ip2:int*ip2=ip;此时,这两个指针指向同一内存空间,可用图1.8表示。图1.8指针与指针所指对象如果程序员想强制赋给指针另一种类型变量的地址,则必须显式进行类型转换。如要将一个整型指针的值赋给浮点数指针,可以采用以下语句:float*fp=ip;通过直接分配内存地址得到初值。......
2025-09-30
类的每一个成员函数都有一个隐含的特殊指针,通常称为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(MyClass10this,intm);
该函数的第一个参数是指向该类对象的一个指针即this指针。我们在定义该成员函数时并没有看到这样一个参数,因为这个参数是系统隐含的。在成员函数的定义体中,可以通过this访问这个地址参数。
实际上,s.addvalue(9)语句的执行过程如图2.11所示,先创建s1对象,将s1对象的n值增大m,再执行this=s1,等同于s=s1,从而达到将s对象的n增大m的目的。如果了解了this指针的用法,上述MyClass10类的addvalue()成员函数可以等同地改写为:
如果不用this指针,该成员函数等同于以下代码:(https://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指针会引起编译错误。
相关文章
指针初始化有几种方式:指针对象可以被一个具有相同类型的对象初始化。下面的例子将整型指针ip赋给另一整型指针ip2:int*ip2=ip;此时,这两个指针指向同一内存空间,可用图1.8表示。图1.8指针与指针所指对象如果程序员想强制赋给指针另一种类型变量的地址,则必须显式进行类型转换。如要将一个整型指针的值赋给浮点数指针,可以采用以下语句:float*fp=ip;通过直接分配内存地址得到初值。......
2025-09-30
程序设计是指设计、编写和调试程序的方法与过程。由于程序是软件的本体,因此软件的质量主要通过程序的质量体现,因此,研究一种切实可行的程序设计方法至关重要。继承是面向对象程序设计方法的一个重要标志,利用继承机制可以大大提高程序的可重用性和可扩充性。......
2025-09-30
图2.3对象stu1和stu2实际上,类Student的所有成员函数放在公用区中,每个函数代码有一个地址,类Student的每个对象中只存放自己的数据成员值和指向公共区中对应函数的地址,也就是说,类的成员函数是共享的,如图2.4所示,这种对象的存储空间分配方式不仅节省了存储空间,而且各个对象的数据成员分别存放,互不相干。......
2025-09-30
C++中,语句默认都是顺序执行,如果碰到选择或循环语句,顺序执行的规则就要改变。C++中的选择控制语句有if语句、if...else语句、if...else if语句和sw itch语句。对于简单的if...else语句,可以使用条件运算符来代替。“语句1”、“语句2”、…使用sw itch语句应注意下列问题:◇整型表达式包括字符型或枚举型表达式。......
2025-09-30
在类声明中,public、private和protected是关键字,称为成员访问限定符,它们分别表示公有、私有和保护的成员访问权限。其他函数不能访问该类的保护数据成员,也不能调用该类的保护成员函数。◇一旦给出了成员访问限定符,它后面的成员都具有这个成员访问权限,直到出现另一个成员访问限定符或类声明结束为止。类的成员函数可以访问类的所有成员,没有任何限制,而类的对象对类的成员的访问是受成员访问控制符制约的。......
2025-09-30
C++是一种编译性的语言,设计好一个C++源程序后,需要经过编译、连接,生成可执行的程序文件,然后执行并调试程序。当C++源程序设计好后,程序员利用一个编辑系统将源程序输入计算机中的某一个文件中,并进行必要的修改。C++源程序文件的扩展名为.cpp。在VC++6.0环境中,编译和连接两个步骤是由系统本身一次完成的。完整的C++程序的开发步骤如图1.2所示。图1.2C++程序开发步骤......
2025-09-30
为此,C++提供了一个更好的方法,就是利用类的构造函数来初始化类的数据成员。构造函数具有如下几个特点:构造函数名与类名相同,且没有返回值,不能指定函数类型。构造函数通常被声明为公有属性,但它不能像其他成员函数那样被显式地调用,它是在创建对象时被系统自动调用的。例如,可以将例2.1的MyClass类扩展为MyClass2,使其包含两个构造函数:上述类中包含两个构造函数:一个没有参数,另一个有两个参数。......
2025-09-30
C++的标准输入/输出流库用于数据的输入/输出,用于输入/输出的流库包含在头文件iostream.h中。表1.4常用的输入/输出流操纵符显示常数使用cout可以显示字符串和数字,并可显示多个值。因此,用户输入数据时要避免输入的数据超出指定变量的值域。程序的执行结果如下:注意:使用cin输入一个字符串时,其中不能含有空格,否则,cin认为输入结束。......
2025-09-30
相关推荐