This Pointer

Gast #4205283
Lesenswert?

Ich stehe leider vor einem kleinen Verständnis Problem...Kann mir an 
diesem Beispiel den This pointer erklären ?
1
Metro::Metro()
2
{
3
  
4
  this->interval_millis = 1000;
5
  
6
}
7

8

9

10
Metro::Metro(unsigned long interval_millis)
11
{
12
  
13
  this->interval_millis = interval_millis;
14
  
15
}
16

17

18
void Metro::interval(unsigned long interval_millis)
19
{
20
  this->interval_millis = interval_millis;
21
}
22

23
uint8_t Metro::check()
24
{
25

26
  unsigned long now = millis();
27
  
28
  if ( interval_millis == 0 ){
29
    previous_millis = now;
30
  return 1;
31
  }
32
 
33
  if ( (now - previous_millis) >= interval_millis) {
34
  #ifdef NOCATCH-UP
35
  previous_millis = now ; 
36
  #else
37
  previous_millis += interval_millis ; 
38
   #endif
39
    return 1;
40
  }
41
  
42
  return 0;
43

44
}
45

46
void Metro::reset() 
47
{
48
 
49
  this->previous_millis = millis();
50

51
}
Ich stehe leider komplett auf dem Schlauch was bewirkt der ?

Gruß
#4205854
Lesenswert?

hase schrieb:
> Der this-Pointer ist in dem Code überflüssig. In vielen Fällen wird er
> deshalb innerhalb einer Klasse nicht verwendet.

ist er nicht, da der Parameter genauso heißt.
Auch wenn ich das als schlechten Stil bezeichnen würde.

private member variablen kriegen nach den meisten Konventionen auch ein 
"m_" davor, dann würde sich auch die Namensdopplung erübrigen.

Es muss auch nicht schlechter Stil sein, das this explizit 
hinzuschreiben, Wenn dann sollte man es aber konsequent machen. Das hat 
den Vorteil, dass man sofort beim Code lesen weiß, das es ein member und 
keine lokale Variable ist.
Gast #4205951
Lesenswert?

Ich habe den this Pointer immer im Visual-Studio benutzt.
Man schreibt this-> und sofort öffnet sich eine Popup-Box mit allen 
Klassenvariablen. Ging schneller als im .H-File nachzuschauen.

Das this-> wurde dann wieder entfernt.

Member und Parameter gleich zu benennen finde ich auch unschön. Member 
bekommen noch ein m_ spendiert, dann sieht man sofort, was für eine 
Variable das ist.
#4206032
Lesenswert?

Das solte alles klären: (alles getestet)

C++
1
// x.hpp
2
class X {
3
 public:
4
  int y;
5
  void func();
6
};
7
//x.cpp
8
#include<iostream>
9
#include "x.hpp"
10
void X::func(){
11
  std::cout << this << ", " << &y << std::endl;
12
}
13
//main.cpp
14
#include<iostream>
15
#include "x.hpp"
16
int main(){
17
  X x;
18
  std::cout << &x << std::endl;
19
  x.func();
20
}

C:
1
// x.h
2
typedef struct X {
3
  int y;
4
} X;
5
void _ZN1X4funcEv(X*);
6
// x.c
7
#include<stdio.h>
8
#include "x.h"
9
void _ZN1X4funcEv(X* this){
10
  printf("%p, %p\n",this,&this->y);
11
}
12
// main.c
13
#include<stdio.h>
14
#include "x.h"
15
int main(){
16
  X x;
17
  printf("%p\n",&x);
18
  _ZN1X4funcEv(&x);
19
}

Kompiliren:
1
gcc x.c -c -o x.c.o
2
gcc main.c -c -o main.c.o
3
g++ x.cpp -c -o x.cpp.o
4
g++ main.cpp -c -o main.cpp.o
5
gcc main.c.o x.c.o -o c
6
g++ main.cpp.o x.cpp.o -o cpp
7
g++ main.cpp.o x.c.o -o quirx1
8
g++ main.c.o x.cpp.o -o quirx2
Ausfüren:
1
./c
2
./cpp
3
./quirx1
4
./quirx2
Ausgabe:
1
$ ./c
2
0x7ffc5200db40
3
0x7ffc5200db40, 0x7ffc5200db40
4
$ ./cpp
5
0x7ffe49cc4810
6
0x7ffe49cc4810, 0x7ffe49cc4810
7
$ ./quirx1
8
0x7ffc95566bb0
9
0x7ffc95566bb0, 0x7ffc95566bb0
10
$ ./quirx2
11
0x7ffee090a0a0
12
0x7ffee090a0a0, 0x7ffee090a0a0

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren