【问题标题】:Does "this" also adapt to function pointers?“this”是否也适应函数指针?
【发布时间】:2013-06-03 16:44:27
【问题描述】:

Java 有一个构造,它允许方法通过“this()”引用调用自身。 这个约定的名字现在让我忘记了。 编辑:称为构造函数委托,如下所述。只适用于构造函数,而不是我弄错的一般方法。

C++ 是否提供了对自身的引用,而不是特别是本身?

例如,我有一个具有多个重载之类的函数。

void DoesSomething(){
    this->(default1, default2);
}

void DoesSomething(int myValue1){
    this->(myValue1, default2);
}

void DoesSomething(int myValue1, int myValue2){
    //Do stuff
}

【问题讨论】:

  • 函数没有隐式的“this”指针。所以不行。改用函数名。
  • 我们可以说“无限递归”... :)
  • 这样的事情会与 C++ 函数调用运算符冲突 - returntype operator()(parameters);
  • 很容易说下一个最好的事情就是使用函数名本身。以这种方式使用关键字有什么好处吗?
  • 请注意,这里的特定示例使用默认参数构造 void DoesSomething(int myValue1=default1, int myValue2=default2) 会更容易处理。我假设您对不起作用的情况或理解抽象点感兴趣,眼睛?

标签: c++ oop pointers function-pointers


【解决方案1】:

您需要明确指定函数名称:

void DoesSomething(){
    this->DoesSomething(default1, default2);
}

void DoesSomething(int myValue1){
    this->DoesSomething(myValue1, default2);
}

void DoesSomething(int myValue1, int myValue2){
    //Do stuff
}

正如您所描述的那样,对于具有给定名称的其他函数的上下文没有隐含的知识。

请注意,在 Java 中,这仅适用于 构造函数,称为 Constructor Chaining。对于一般方法,它不处理此问题。

C++11 还增加了对这一概念的支持(如 delegating constructors),尽管语法与 Java、C# 和其他具有此概念的语言不同。

对于构造函数,在 C++11 中,你可以这样写:

SomeType() : SomeType(42) {}

SomeType(int arg)
{
   // ...

【讨论】:

  • 您可以添加 C++ 中的构造函数链接使用不同的语法(但与 Java 中的工作原理基本相同)。
  • 主要是针对我在这里考虑的构造函数。似乎 C++11 here 说了一些关于委托和链接构造函数的内容。
  • @JamesKanze 添加了此参考。
  • @DanielPark 这确实适用于构造函数 - 编辑显示。
  • @ReedCopsey 干杯。我认为这会写在大脑便利贴上。
【解决方案2】:

该代码需要修改为:

void DoesSomething(){
    this->DoesSomething(default1, default2);
}

void DoesSomething(int myValue1){
    this->DoesSomething(myValue1, default2);
}

void DoesSomething(int myValue1, int myValue2){
    //Do stuff
}

或到

void DoesSomething(){
    DoesSomething(default1, default2);
}

void DoesSomething(int myValue1){
    DoesSomething(myValue1, default2);
}

void DoesSomething(int myValue1, int myValue2){
    //Do stuff
}

因为实际上不需要在代码中明确说明“this”。 C++ 中确实存在的东西称为函数对象,如下所述:http://www.cprogramming.com/tutorial/functors-function-objects-in-c++.html

【讨论】:

  • 我确实喜欢“函子”的想法。能不能叫代码合并?
  • 也许吧,但称它为“函子”更容易混淆,因为这样其他人都会知道你在说什么。
【解决方案3】:

this 指向调用成员函数的对象。当函数需要返回对自身的引用时,我最常使用它,例如,operator()=;当重载这个操作符时,你也经常会看到类似下面的东西来防止自赋值

foo& foo::operator=(const foo& rhs ){
  if (  this != &rhs ) { 
      //do something
  }
  return *this;
}

我认为这回答了你的问题??

参考:http://msdn.microsoft.com/en-us/library/y0dddwwd.aspx

【讨论】:

  • 异常安全的复制分配不需要自引用检查。
  • 好吧,我添加它是为了指出“this”指针的另一种用法。但除此之外,这是一个简单的检查,可以防止未来的头痛。
  • 我最常看到this 的地方是return *this,用于从派生类模板访问父类的成员:ideone.com/6sFNjb。如果我看到if (this!=&rhs) 的复制分配,我会立即假设该函数不是异常安全的。 (例如,您链接到的示例不是异常安全的)
猜你喜欢
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多