当我们在c ++中为类创建一个成员函数时,它有一个隐式的额外参数,它是一个指向调用对象的指针 - 被称为this.
对于任何函数都是如此,即使它不使用this指针也是如此.例如,给定班级
class foo
{
private:
int bar;
public:
int get_one()
{
return 1; // Not using `this`
}
int get_bar()
{
return this->bar; // Using `this`
}
}
Run Code Online (Sandbox Code Playgroud)
两个函数(get_one和get_bar)都将this作为隐式参数,即使其中只有一个实际使用它吗?
这样做似乎有点浪费.
注意:我理解正确的做法是做get_one()静态,答案可能取决于实现,但我只是好奇.
var f = function() {
this.x = 5;
(function() {
this.x = 3;
})();
console.log(this.x);
};
f.call(f);
f();
f.call();Run Code Online (Sandbox Code Playgroud)
var f作为f.call(f)输出运行5。当作为f()或f.call()输出运行时3。
在每种情况下会发生什么?内部功能this指的是什么?
为什么C#编译器甚至没有对此代码发出警告?:
if (this == null)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
显然,这种情况永远不会得到满足.
虽然我理解$this当在静态上下文中调用方法时该变量不可用,但为了帮助将我的应用程序组件彼此解耦,我认为从实例调用静态方法是有意义的.例如:
class MyExample{
private static $_data = array();
public static function setData($key, $value){
self::$_data[$key] = $value;
}
// other non-static methods, using self::$_data
}
// to decouple, another class or something has been passed an instance of MyExample
// rather than calling MyExample::setData() explicitly
// however, this data is now accessible by other instances
$example->setData('some', 'data');
Run Code Online (Sandbox Code Playgroud)
是否有计划弃用此类功能,或者我是否愿意期待对此的支持?我一起工作error_reporting(-1)以确保一个非常严格的开发环境,并且目前还没有任何问题(PHP 5.3.6)但是我知道反向变得不受支持; 也就是说,静态调用实例方法.
我想我无法理解为什么这不起作用.我一直以为我可以在构造函数中使用'this'指针,但我从来不知道我不能在初始化列表中使用'this'.
#include <iostream>
class A {
public:
int a;
int b;
A(int a = 0, int b = 0) : this->a(a), this->b(b) { }
void print() {
std::cout << a << ", " << b << std::endl;
}
};
int main() {
A a;
a.print();
}
Run Code Online (Sandbox Code Playgroud)
我很想知道与之相关的细节.
我从编译器得到的错误是"赋值的左侧必须是变量".我的用例是深度复制,但并不真正相关.
在C++中,可以分配给*this.
问题不在于如何规避任务this.这很简单,但是决定不做this变量的背后有什么理由.
原因是技术性的还是概念性的?
我的猜测到目前为止 - 在随机方法中重建Object的可能性容易出错(概念性),但技术上可行.
编辑请限制"因为Java规范如此说"的变化.我想知道决定的原因
你能帮我解决下面的代码吗?错误是:"无法在静态上下文中使用它"
public class Sample2 {
/**
* @param args
*/
public static void main(String[] args)
{
Sample2 sam=new Sample2();
//Below code works fine
System.out.println(sam);
//Below code is displaying error
System.out.println(this);
}
}
Run Code Online (Sandbox Code Playgroud) 根据本地测试,'this'在行渲染函数中似乎为null.因此,这阻止了我在onPress道具上绑定本地函数.
我有这个渲染块:
render() {
return (
<ListView
dataSource={this.state.dataSource}
renderRow={this._renderRow}
renderHeader={this._renderHeader}
style={styles.listView} />
);
}
Run Code Online (Sandbox Code Playgroud)
和一个本地功能
_visitEntryDetail() {
console.log('test');
}
Run Code Online (Sandbox Code Playgroud)
然后行渲染
_renderRow(something) {
return (
<TouchableHighlight
style={[styles.textContainer, filestyle.container]}
onPress={this._visitEntryDetail.bind(this)} >
<View>
<Text style={filestyle.text1} >{something.detail}</Text>
<Text style={filestyle.text2} >{something.size}, {something.timestamp}</Text>
</View>
</TouchableHighlight>
);
}
Run Code Online (Sandbox Code Playgroud)
这回来了
message: null is not an object (evaluating 'this.$FileList_visitEntryDetail')"
Run Code Online (Sandbox Code Playgroud)
检查renderRow上的"this"在替换上面的代码时返回null:
_renderRow(file) {
console.log(this);
return (
<TouchableHighlight
style={[styles.textContainer, filestyle.filelistcontainer]}
>
Run Code Online (Sandbox Code Playgroud)
以下控制台输出:
RCTJSLog> null
Run Code Online (Sandbox Code Playgroud)
但是很好
render() {
console.log('inside render. this value is below me');
console.log(this);
return (
<ListView
Run Code Online (Sandbox Code Playgroud)
安慰
RCTJSLog> "inside …Run Code Online (Sandbox Code Playgroud) 我尝试使用windbg在输入成员函数时打印"this"指针,如下所示.
class IBase {
int m_i;
public:
IBase() :m_i(23) {}
virtual int FuncOne(void) = 0;
virtual int FuncTwo(void) = 0;
};
class DerivedOne : public IBase {
public:
virtual int FuncOne(void) { return 1; };//set break point here.
virtual int FuncTwo(void) { return 2; };
};
class DerivedTwo : public IBase {
public:
virtual int FuncOne(void) { return 101; };
virtual int FuncTwo(void) { return 102; };
};
void DoIt(IBase* Base)
{
int i=Base->FuncOne();//break point here
}
int main(int argc, …Run Code Online (Sandbox Code Playgroud) 我有一个静态方法的类:
class User {
constructor() {
User.staticMethod();
}
static staticMethod() {}
}
Run Code Online (Sandbox Code Playgroud)
对于静态方法是否有这样的东西(即引用没有实例的当前类).
this.staticMethod()
Run Code Online (Sandbox Code Playgroud)
所以我不必写类名'User'.
this ×10
c++ ×3
java ×2
javascript ×2
break ×1
c# ×1
class ×1
deprecated ×1
listview ×1
null ×1
performance ×1
php ×1
pointers ×1
react-native ×1
reference ×1
static ×1
syntax-error ×1
windbg ×1