当前位置:首页 » 文件传输 » 如何理解空指针可以访问成员函数
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

如何理解空指针可以访问成员函数

发布时间: 2022-05-12 18:48:11

⑴ 为啥用空指针调用函数程序不崩溃

class MyClass{public:int i;void hello(){printf("hello/n");}void print(){printf("%d/n", i);}};void main(){MyClass* pmy = NULL;pmy-hello();}看上面的这段代码,似乎很诡异。 用一个空指针调用成员函数,简直是天大的错误,可以遗憾的是,...

⑵ 为什么C++调用空指针对象的成员函数可以运行通过

很多时候代码中需要的是指针的类型,而不是指针中的值;所以指向NULL也是无所谓的;比如多重继承的时候,

⑶ c++中空指针对象访问成员问题

我这么说吧。因为fun3函数里没有直接或间接用到this指针。
什么叫直接?你写了 this 在里面,并且这个this被访问了。
什么叫间接?你没直接写 this 但是用了成员变量等。

因为C++编译的时候,fun3是静态绑定的,所以运行的时候没有“查找对象上的fun3函数”的过程,对象有没有存在也不影响。

你可以尝试一下把fun3改成虚拟函数(virtual),这样调用过程就变成动态绑定,它就会出错了

⑷ 对象指针为NULL,为什么还是可以调用成员函数

要理解这个的话。。。成员函数其实可以认为是一个普通的函数,比如

classA{
public:
voidfunc(intx){cout<<"hello,A.x="<<x<<endl;}
};

在编译器看来,大概就长这个样子吧:

voidA_func(A*this,intx){cout<<"hello,A.x="<<x<<endl;}

你平时使用成员函数的时候,大概就是这样的:

Aa;
a.func(2);

其实在编译器看来,是这个样子的:

A_func(&a,2);

如果这么说的话,也许你就理解了,为什么对象是NULL的时候还可以调成员函数:

A*pa=NULL;
pa->func(2);
//在编译器看来就好像是A_func(pa,2);且pa==NULL

((A*)NULL)->func(2);
//在编译器看来就好像是A_func(((A*)NULL),2);

-----我是分割线-----

上面的例子中func函数里并没有使用成员变量。考虑有成员变量并且在成员函数里使用的情况,就会不一样了:

classA{
private:
inty;
public:
voidfunc(intx){y=x;}
};

注意此时y是成员变量,编译器会自动给它加上this->,也就是

voidA_func(A*this,intx){this->y=x;}

此时正常的情况就不用说了,说说用NULL对象指针调用成员函数的情况:

A*pa=NULL;
pa->func(2);
//在编译器看来就好像是A_func(pa,2);且pa==NULL

((A*)NULL)->func(2);
//在编译器看来就好像是A_func(((A*)NULL),2);

//好吧我承认这段代码跟上面的一毛一样啦!

此时程序会崩溃!为什么?因为this指针是NULL,而你访问了它的y变量!

----又是我哈哈哈-----

结论:

  1. 通过对象调用成员函数,对象的指针会被传入函数中,指针名称为this

  2. 因此NULL对象指针也可以调用成员函数

  3. NULL对象指针调用成员函数时,只要不访问此对象的成员变量,则程序正常运行

  4. NULL对象指针调用成员函数时,一旦访问此对象的成员变量,则程序崩溃

⑸ 为什么一个类的空指针可以访问类的成员函数

class MyClass{public:int i;void hello(){printf("hello/n");}void print(){printf("%d/n", i);}};void main(){MyClass* pmy = NULL;
pmy-hello();}看上面的这段代码,似乎很诡异。 用一个空指针调用成员函数,简直是天大的错误,可以遗憾的是,却是可行的,至少对于上面的这段程序来说,不会照成错误。
之前运行的原因。
大家知道,每个对象,都有一个指向自己的this指针,这个指针的值,将会因为对象的不同而不同,它的作用主要就是用来区分不同的对象,这样你就可以根据它
来访问不同的对象的成员变量。然而,我们main函数中的hello函数并没有使用类中的任何成员变量,所以,它也就不会用到this指针,此时的this指针是NULL。从而
我们就可以没有障碍的使用hello函数,然而相对的是,如果你在pmy-hello()之后接着调用pmy-print(),那么将会报空指针错误,因为这个函数试图用this指针访问成员变量i。

⑹ 对象指针访问其对象的成员函数的机制是如何 c++

对于const对象,是只能访问const成员函数的,所以,你定义的base是没有const成员函数的,所以无法进行转换,你去掉const,或者在虚函数那个show函数后边加上const限制,都是可以解决问题的。
a. const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数.
b. const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的.
c. const成员函数不可以修改对象的数据,不管对象是否具有const性质.它在编译时,以是否修改成员数据为依据,进行检查.
e. 然而加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的const成员函数是可以修改它的

⑺ C++类的空指针为什么可以输出数据

楼主。。进入一个误区了

你说的那个空指针。那个是给指针初始赋值,让他等于NULL
可是在viod OutPut(){cout << "Output Called!"};
。根本不需要传递任何东西进来。这个功能就是打印出这样的一句话。

你的指针有初始就是对的。只要是对的话,那么他就会执行这一句打印的。

⑻ C++函数指针和空指针的问题

函数int plus(int b)的指针类型原型为:int (*)(int)

其中左侧int指定函数返回类型,右侧(int)表示函数的参数类型。指针类型定义中,凡是右侧有括号的都表示是个函数指针,而括号内可以定义0个或多个参数,以逗号分隔。中间的(*)把星号独立起来表示是个指针定义。

当要直接定义一个函数指针时将变量名放星号后面,比如这样:

int (*p)(int) =NULL;

双参数定义:int (*p)(int,int) =NULL;


图例中由于pV是个虚指针(万能指针),可以赋值任意类型的地址,因此pV=Plus不会报错,但访问时必须强转,否则编译器不知道如何访问指针(强转就是将指定类型放在变量左侧,比如(int)a就是将a的值强转为int类型),强转格式:(类型) 变量 ,那么外面要套一层括号:(int (*)(int))pV,我们需要用强转后的函数指针传递参数进行函数调用,为避免歧义,因此需要连同变量名再打包一次:((int (*)(int))pV),随后再传递参数10:

((int (*)(int))pV)(10)

括号打包的内容可以看作一个整体/对象,你迷惑的主要因素应该有两点:

1、不知道如何定义函数指针类型。

实际上就是将函数定义中的函数名用(*)替换,再将参数名去掉就可以了,比如下面这个函数

int * Fun(int a,char c){。。。。。。}

其函数指针类型为: int * (*)(int,char)

指针定义:int* (*p)(int, char);

2、括号嵌套多了看起来比较乱。这个很简单,一层一层拆解一层层理解。


⑼ C语言中,空指针的使用意义是什么在编程中使用空指针会带来什么影响

  • 语言定义中说明,每一种指针类型都有一个特殊值——“空指针”——它与同类型的其它所有指针值都不相同,它“与任何对象或函数的指针值都不相等”;

  • 不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。

  • 指针是个很强大的工具,可是正因为它太强大,所以要操作它不是件易事。操作不当造成的野指针,甚至会引起系统死机等比较严重的后果。

    如果程序定义了一个指针,就必须要立即让它指向一个我们设定的空间或者把它设为NULL,如果没有这么做,那么这个指针里的内容是不可预知的,即不知道它指向内存中的哪个空间(即野指针),它有可能指向的是一个空白的内存区域,可能指向的是已经受保护的区域,甚至可能指向系统的关键内存,如果是那样就糟了,也许我们后面不小心对指针进行操作就有可能让系统出现紊乱,死机了

⑽ 谈谈基类指针对类的成员函数的访问权限问题

基类指针
对其自己的成员函数:随便访问
对子类成员函数:不可访问(对于虚函数,都是子类的指针对子类重写的新的虚函数的引用,或者未重写时候,父类的虚函数的引用,父类即使用指针引了虚函数,也是引自己的)