c++ this指针的目的是什么?

c++ this指针的目的是什么?,第1张

哎,这些东西如果一说就复杂了。

是这样的,其实不管C语言还是C++语言,最后编译成机器码并没有什么本质的区别,所谓类,虽然在语言这个层面有了一个概念性的解释(相同属性相同 *** 作的集合的抽象化),但是实际上在二进制的表示和结构上没有什么本质的区别,都是一个内存区域保存了一些值。那这样一来,就可能使得程序员跨过一个类的限制(比如应该只能访问自己的成员,但是你想办法访问了其他对象的成员)。

所以C++在设计的时候就隐含了一个this指针,这个指针主要是用于保证你的访问不能跨界和用于区分不同的对象。举个例子,你的任何一个函数的申明实际隐含了一个this指针参数,这个参数你不可见,也不可编辑,是编译器自动添加上去的,为什么要这样?实际上对象在实例化的时候,体积是非常小的,并没有每一个对象都保存函数,同一个类的对象的函数实际上只有一份副本(二进制层面),那如何来区分到底是谁调用了函数?就是这个this指针。

this指针实际是指向了对象的内存地址起始值,所以通过一个偏移量,就知道了对象的各种属性(变量),也就确定了一个绝对的对象。当然在对象的函数 *** 作里我们可以显示的用this->的方式来引用变量,但是你也发现你即使不加上this指针,它依然知道你引用了谁,其实就是隐含了一个参数this指针。

为了进一步理解,想一下static修饰的函数有什么区别,为什么static函数只能访问static修饰的属性?因为static修饰的函数就没有传递这个this指针,所以它不知道你指的是哪一个对象。而实际上,static修饰的符号就和C语言的全局变量和函数无区别了。

C++中的"this"指标是什么意思?

A.静态成员函式没有this指标

B。由友元函式本质上不属于这个类,所以也没有。

C。明显错

D。对的。

A.fun1. 就是上面选择题的知识点

this指标是指一个类,在例项化时,也就是生成物件时。

其实可以生成很多物件,怎么区别是哪个物件要呼叫共同的成员函式呢。

本物件在呼叫成员函式,如何让编译器识别出,所以就有必要用一个指标来指向这个物件。

就是指向自己,所以有了this指标。

静态成员函式,是被这个类所有的物件共有的,所有不需要this来区别呼叫,直接呼叫就是。

友元函式本质上是不是这个类里的函式,只是有特权的访问而已,不是这个类的东西,没必要给this指标。

c中的指标是什么意思?

为了方便起见,完全可以这样理解:指标就是变数的地址.其实指标好似一个容器,用来装既定的变数在记忆体中分配的那个特定的地址,作用是通过那个特定的地址来指向既定的变数,形成间接访问.

C++中的指标是什么意思?有什么作用啊?, C语言中的空指标是什么意思?

这样一看才知道大家对空指标的概念如此浑浊哦!!

首先:

void* 这不叫空指标,这叫无确切型别指标.这个指标指向一块记忆体,却没有告诉程式该用何种方式来解释这片记忆体.所以这种型别的指标不能直接进行取内容的 *** 作.必须先转成别的型别的指标才可以把内容解释出来.

还有'\0',这也不是空指标所指的内容. '\0'是表示一个字串的结尾而已,并不是NULL的意思.

真正的空指标是说,这个指标没有指向一块有意义的记忆体,比如说:

char* k

这里这个k就叫空指标.我们并未让它指向任意地点.

又或者

char* k = NULL

这里这个k也叫空指标,因为它指向NULL 也就是0,注意是整数0,不是'\0'

一个空指标我们也无法对它进行取内容 *** 作.

空指标只有在真正指向了一块有意义的记忆体后,我们才能对它取内容.也就是说要这样

k = "hello world!"

这时k就不是空指标了.

php中的指标是什么意思

PHP中并没提及指标,也不是PHP的方向.

C和指标,这本书中的指标是什么意思?

指标在汇编的层上看,实际上是一个长整数,表示记忆体的地址。在C语言层面上,可以看着是指向某地址的一个指示器,所以叫做指标。 类似WINDOWS系统里面的快捷方式。

在c++中双指标是什么意思和用法,如int**

指标的指标

int**也就是说指标A中储存著另个一个指标B的地址,而指标B指向一个int的变数.

int*就是指标指向一个int的变数。

int**可以理解为一个指标指向int*。

c++中的#include "stdafx.h"是什么意思

添加了名为stdafx.h的标头档案,里面有一些函式你可能会用到,预编译用的

#include "stdafx.h"

是预编译处理器把stdafx.h档案中的内容载入到程式中来。

stdafx.h

1名称的英文全称为:Standard Application Fram Extend

所谓标头档案预编译,就是把一个工程(Project)中使用的一些MFC标准标头档案(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分标头档案,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。

预编译标头档案通过编译stdafx.cpp生成,以工程名命名,由于预编译的标头档案的字尾是“pch”,所以编译结果档案是projectname.pch。

编译器通过一个头档案stdafx.h来使用预编译标头档案。stdafx.h这个标头档案名是可以在project的编译设定里指定的。编译器认为,所有在指令#include "stdafx.h"前的程式码都是预编译的,它跳过#include "stdafx. h"指令,使用projectname.pch编译这条指令之后的所有程式码。

因此,所有的MFC实现档案第一条语句都是:#include "stdafx.h"。

2 详细工作原理及作用

stdafx.h中没有函式库,只是定义了一些环境引数,使得编译出来的程式能在32位的作业系统环境下执行。

Windows和MFC的include档案都非常大,即使有一个快速的处理程式,编译程式也要花费相当长的时间来完成工作。由于每个.CPP档案都包含相同的include档案,为每个.CPP档案都重复处理这些档案就显得很傻了。

为避免这种浪费,AppWizard和VisualC++编译程式一起进行工作,如下所示:

◎AppWizard建立了档案stdafx.h,该档案包含了所有当前工程档案需要的MFCinclude档案。且这一档案可以随被选择的选项而变化。

◎AppWizard然后就建立stdafx.cpp。这个档案通常都是一样的。

◎然后AppWizard就建立起工程档案,这样第一个被编译的档案就是stdafx.cpp。

◎当VisualC++编译stdafx.cpp档案时,它将结果储存在一个名为stdafx.pch的档案里。(副档名pch表示预编译标头档案。)

◎当VisualC++编译随后的每个.cpp档案时,它阅读并使用它刚生成的.pch档案。VisualC++不再分析Windowsinclude档案,除非你又编辑了stdafx.cpp或stdafx.h。

这个技术很精巧,你不这么认为吗?(还要说一句,Microsoft并非是首先采用这种技术的公司,Borland才是。)在这个过程中你必须遵守以下规则:

◎你编写的任何.cpp档案都必须首先包含stdafx.h。

◎如果你有工程档案里的大多数.cpp档案需要.h档案,顺便将它们加在stdafx.h(后部)上,然后预编译stdafx.cpp。

◎由于.pch档案具有大量的符号资讯,它是你的工程档案里最大的档案。

如果你的磁碟空间有限,你就希望能将这个你从没使用过的工程档案中的.pch档案删除。执行程式时并不需要它们,且随着工程档案的重新建立,它们也自动地重新建立。

3 如何理解其原理

通俗一点说

当我们使用AppWizard来自动生成某些专案的时候,系统会自动把所需要include的标头档案在stdafx.h中先include一下,这样,我们只需要直接include这个stdafx.h档案即可.因为同一个专案中的不同原始档CPP都包含相同的include档案,这样,为每个.CPP档案都重复include这些档案就显得很傻了。当然如果你不用MFC的话就不用了。即:在每个.cpp档案中都include stdafx.h 就相当于包含了其他的如iostream.h等档案

4 与stdio.h的区别

我们一般用TC或vc编译C程式的时候都要首先包含这个stdio.h标头档案,这个标头档案里面包含了scanf和printf函式的定义,如果我们不在程式开头include这个档案,那么你呼叫上面这两个函式就不会成功,它其实和c++中的iostream.h档案的作用差不多的,它们一般都已经在stdafx.h档案中被包含。

C语言中的空指标是什么意思?山东

这样一看才知道大家对空指标的概念如此浑浊哦!!

首先:

void* 这不叫空指标,这叫无确切型别指标.这个指标指向一块记忆体,却没有告诉程式该用何种方式来解释这片记忆体.所以这种型别的指标不能直接进行取内容的 *** 作.必须先转成别的型别的指标才可以把内容解释出来.

还有'\0',这也不是空指标所指的内容. '\0'是表示一个字串的结尾而已,并不是NULL的意思.

真正的空指标是说,这个指标没有指向一块有意义的记忆体,比如说:

char* k

这里这个k就叫空指标.我们并未让它指向任意地点.

又或者

char* k = NULL

这里这个k也叫空指标,因为它指向NULL 也就是0,注意是整数0,不是'\0'

一个空指标我们也无法对它进行取内容 *** 作.

空指标只有在真正指向了一块有意义的记忆体后,我们才能对它取内容.也就是说要这样

k = "hello world!"

这时k就不是空指标了.

C语言里面没有this这个关键字的。这个关键字只用C++里面有

class

A{

public

void

getss(){

//此时这里的this代表的是累的实例

this->ges()

//等同于类的实例去调用

}

public

void

ges(){

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12026752.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存