核心提示:C++编程的重要基础是类和对象。 对象指针是非常重要的一部分,包括对象指针、对象成员指针、this指针、对象常量指针、常量对象指针等。
在C++中,指针被大量使用,我不禁对其中的许多指针用法感到有点困惑。 由于我从图书馆借了一本谭浩强教授主编的《C++面向对象程序设计》,可以帮助我理解。 理清了我的思绪。 现在我给大家展示一些内容,希望对大家有所帮助。
C++编程的重要基础是类和对象。 对象指针是非常重要的一部分,包括指向对象的指针、指向对象成员的指针、this指针、指向对象的常量指针、指向常量对象的指针等。
1. 指向对象的指针
定义:对象空间的起始地址是对象的指针。
说明:在创建对象时,编译系统会为每个对象分配一定的存储空间来存储其成员,但需要注意的是,一般情况下,不同对象的数据存储单元中存储的数据成员是不同的,不同的对象的数据成员存储在不同的对象中。 的功能码是相同的,也就是说它们的功能码是共享的。 这时我们可以定义一个指针变量来存储对象的指针。
定义指向类对象的指针变量的一般形式是:
类名*对象指针名;
例如,对于 Time 类对象,我们可以有:
时间t;
时间*p;
p=&t;
我们可以通过对象指针访问对象及其成员。 如果定义的类有数据成员hour、sec,且成员函数有(),则
(*p).hour是p指向的对象中的hour成员,相当于t.hour
(*p).()是p指向的对象中的成员函数(),相当于t.()
您还可以使用以下表格:
p->hour 和 p->() 与上面等效。
如果你想学习更多C/C++编程知识,可以加入C/C++学习交流群:和大家交流学习。
2. 指向对象成员的指针
(1) 指向对象数据成员的指针
在C语言中,我们已经了解了指向普通变量的指针变量。 C++中定义指向对象数据成员的指针变量的方法与定义指向普通变量的指针变量的方法相同。 其一般形式为:
数据类型名*指针变量名;
喜欢:
整数*p;
p=&t.小时; //将对象t的数据成员hour的地址赋给p,p指向t.hour
(2) 指向对象成员函数的指针
定义指向对象成员函数的指针变量与定义指向普通函数的指针变量不同。
在定义指向普通函数的指针变量时,我们可以这样定义:
无效(*p)();
p=乐趣;
(*p)(); //调用fun函数
但编译系统要求将函数地址赋给指针变量时必须满足三个条件:
函数参数类型和数量必须匹配
函数返回值的类型必须匹配
它所属的类必须匹配
显然上面的p与类无关。 为了满足第三条,我们可以为指针指定一个类,所以定义指向对象成员函数的指针变量的一般形式是:
数据类型(类名::*指针变量名)(参数列表列);
可以让指针指向一个公共成员函数,例如:
void (时间::*p)(); //定义指向Time类对象的成员函数的指针变量p
p=&时间::; //将Time类的成员函数()的地址赋给指针变量p
(t.*p)(); //调用Time类对象的成员函数t()
注意:由于成员函数不存储在对象空间中,并且同一类型的多个对象共享该成员函数代码,因此将成员函数的入口地址赋给指针变量应该写为:
指向对象成员函数的指针变量 =&类名::成员函数名;
成员函数名后面没有“()”,写p=&Time::()是错误的。
如果你想学习更多C/C++编程知识,可以加入C/C++学习交流群:和大家交流学习。
3.this指针
每个成员函数都包含一个特殊的指针,称为this,它是指向本类对象的指针,它的值是当前调用的成员函数所在对象的起始地址。 之所以有这个指针,是因为它是系统自动实现的,以保证同一类型的不同对象的成员函数引用指定对象中的数据成员。
例如,定义一个函数来查找体积
int 框::vol()
{(*宽度*);}
如果已经定义了对象t,那么当调用成员函数t.vol()时,编译系统会将对象t的起始地址赋给this指针,这样当成员函数引用数据成员时,该对象就可以根据指针this来引用。 t.So的数据成员,C++将上面的函数处理成
int 框::vol()
{(这个->*这个->宽度*这个->);}
由于this的值是当前调用的成员函数所在对象的起始地址,因此可以写为
int 框::vol()
{((*这个).*(*这个).宽度*(*这个).);}
因此,在调用成员函数t.vlo()时,实际的调用方法是t.vol(&t),但对象t的地址是系统自动传递给这个指针的,不需要手动添加。
4.指向对象的常量指针
将指向对象的指针变量声明为const并初始化,这样指针值始终保持其初始值,并且其指针不能改变。
喜欢:
时间t1(8,8,8),t2;
时间 *const p=&t1; //常量指针p指向对象t1
p=&t2; //试图改变p的方向,非法
从上面我们可以看出,定义指向对象的常量指针的一般形式是:
类名*const指针变量名=对象的起始地址;
注意:指向对象的常指针变量的值不能更改,但它所指向的对象中的数据成员的值可以更改。
常量指针一般用作函数的参数,这样在函数执行过程中不允许指针变量的值发生改变,使其始终指向原来的对象。
如果你想学习更多C/C++编程知识,可以加入C/C++学习交流群:和大家交流学习。
5. 指向常量对象的指针变量
首先,我们回顾一下指向常量变量的指针变量。 其一般形式为:
const类型名*指针变量名;
喜欢:
常量字符*p;
如果一个变量已经声明为常变量,则只能使用指向常变量的指针变量来指向它,而不能使用一般的指针变量。 另外,除了常量变量外,指向常量变量的指针变量也可以指向未声明为const的变量,但它们的值不能通过指针改变。 例如:
char c='a' //定义字符变量c,未声明为const
常量字符*p; //定义指针变量p指向常量变量
p=&c; //p指向字符变量c
*p='b'; //非法的
c='b'; //合法的
注:上例中,指针变量p指向字符变量c。 这并不意味着 c 也被声明为常量变量。 这只意味着当通过指针变量引用c时,c具有常变量的特性,其值不能改变。 但c仍然是一个普通变量。
在指向常变量的指针中,函数参数的指针类型有几点值得注意:
如果函数参数是非常量类型的指针变量,则实参只能是指向非常量类型的指针; 如果函数参数是指向const类型变量的指针,则实际参数可以是const类型或非const类型的指针变量。 换句话说,指向常量变量的指针可以指向const和非常量变量,而指向非常量变量的指针只能指向非常量变量。
现在让我们进入正题。 指向常量对象的指针变量与指向常量变量的指针变量类似。
如果一个对象被声明为long对象,那么它只能被指向常量对象的指针变量所指向,而不能被一般的指针变量所指向。
如果定义一个指向 const 对象的指针变量并使其指向非 const 对象,则无法通过指针更改它所指向的对象。
如果定义了指向常量对象的指针变量,则不能通过它改变所指向的对象的值,但可以改变指针变量本身的值。
喜欢:
时间t1(8,8,8),t2; //定义对象
常量时间 *p=&t1; //定义一个指向常量对象的指针p并使其指向t1
p=&t2; //合法,指针p指向对象t2
所以当我们希望调用函数时不修改对象的值时,可以将形参定义为const指针变量,并使用对象的地址作为实参(对象可以是const也可以是非const) -常量); 当 对象不仅在调用函数中不会改变,而且在程序执行过程中也不会改变,所以我们将其定义为 const 类型。 因此,指向常量对象的指针最常用作函数的参数,以保护形参指针所指向的对象在函数执行过程中不被修改。
以上是我学习C++指针的记录,也是对C++指针用法的总结。 我觉得对大家学习C++应该很有帮助
如果你想学习更多C/C++编程知识,可以加入C/C++学习交流群:和大家交流学习。
好了,今天的主题就讲到这里吧,不管如何,能帮到你我就很开心了,如果您觉得这篇文章写得不错,欢迎点赞和分享给身边的朋友。