C++中的this与js中的this

来源:互联网 发布:饺子 知乎 编辑:程序博客网 时间:2024/05/16 06:55

在C++中也有this,是一个指针,它在类中,《C++ primer》中说函数接口那也隐藏着this,是一个隐藏的函数参数。

c++中典型的修改this属性就是在类成员函数那修改this指针为常量

比如如下程序:

#include <iostream>using namespace std;class Foo{public:Foo( ) = default;Foo( int num ):num(num){}int fuc(  )const{return this->num;}private:int num;};int main() {const Foo f = Foo(10);cout<<f.fuc();return 0;}



这里int fuc(  )const{ return this->num; }将函数内的this指针修改成了const的。

这样就可以让类的常量对象调用fuc()。来思考下为什么不修改fuc函数的this属性就常量对象就不可以调用fuc函数了呢?

fuc(  )可以看成fuc( this ),这里的this是隐藏起来的,当我们使用const修饰这个函数时fuc()const可以看成fuc( const this )

 这样在调用这个函数时有f.fuc( this ),调用时需要传参,可以看出将调用函数的this赋值给被掉函数的this,

即 (调用函数的this)this = this(定义的调用函数的this)

将常量引用或者指针绑定到非常量或者常量的对象,字面值,表达式上可以,但将非常量引用绑定到常量的对象,字面值上就会出错。

假如非常量引用或者指针可以绑定到常量上那么我们岂不是可以通过这个非常量引用或者指针修改保存在常量的值!下面的代码编译时报错:

Description ResourcePathLocationType
binding 'const int' to reference of type 'int&' discards qualifiers

#include <iostream>using namespace std;int main() {const int a = 10;int&  b = a;cout<<b<<endl;return 0;}


爱思考的童鞋可能又会问,问什么常量引用或者指针绑定到非常量对象上,甚至于类型都不相同。

double dval = 10;

const int& ci = dval;

为了确保ci绑定整数上,编译器将代码变为:

double dval = 10;

const int temp = dva;

const int& ci = temp;

上面的temp其实是一个临时量对象,临时量对象是当编译器需要空间暂时保存一个表达式的结果时临时创建的一个未命名对象。(有时候编译器优化可能会省掉这个临时量)

从上面可以看到这个临时量对象默认似乎是const。因此C++不允许将非常量引用绑定到临时对象上。

https://msdn.microsoft.com/zh-cn/library/cfbk5ddc.aspx

http://blog.csdn.net/liuxialong/article/details/6539717

当然,非常量引用可以绑定到非常量上,这时类型必须一致,因为我们即使为了绑定建立一个同类型的临时对象也无法绑定。

以上分析,将C++中的成员函数的this改为const的,就可以让非常量对象和常量对象都能调用了。


下面看js中的this, is中的this和c++,java中的this完全不同。

js高程里提到,函数内部有一个特殊的对象this,this引用的是函数执行的环境对象,也就是说this的值是函数的执行环境对象


在全局作用域调用sayColor( ),this引用的是全局对象,当对象o调用o.sayColor()时this引用的是对象o。

上面的o.sayColor中this绑定方式是隐式绑定,隐式绑定会发生丢失绑定对象的事情,将this绑定到全局对象或者undefined上。


上面代码为什么会输出red,因为这里bar其实引用的是foo函数本身,因此bar()其实是一个不带任何修饰的函数调用,因此执行的是默认绑定

这里this绑定到了window上。

有隐式绑定相对的也有显示绑定,说到显示绑定不得不提call(),apply( ).

call(),apply()第一个参数是一个对象,这个对象绑定到this上。

上面代码通call()将函数内的this绑定到了对象o上,因此输出的是o.color

关于js中的this还有很多内容,显示绑定不能解决绑定丢失的问题,还有硬绑定。

下面再介绍下new绑定吧

使用new绑定时,新对象都会绑定到函数调用的this上,因此上面有bar.a = 5


关于js中的this还有其他内容比如软绑定,优先级等问题。但是从以上分析可以看到js中的this与C++,java中的this完全不同。

参考:

你不知道的js上册

js高级教程

C++primer

https://msdn.microsoft.com/zh-cn/library/cfbk5ddc.aspx

http://blog.csdn.net/liuxialong/article/details/6539717





原创粉丝点击