Avatar billede conrad Nybegynder
07. november 2003 - 21:32 Der er 9 kommentarer og
1 løsning

forskel på functions kald

Hvad er forskellen/resultatet af disse to kald

void Obj::add(int& id, Obj* tval)
{
    mymap[id] = tval;
}

og

void Obj::add(int id, Obj* tval)
{
    mymap[id] = tval;
}
Avatar billede arne_v Ekspert
07. november 2003 - 21:35 #1
Ingen.

Forskellen er nemlig kun hvis du ændrer i id og det gør du ikke.
Avatar billede soreno Praktikant
07. november 2003 - 21:42 #2
Med den øverste vil ændringer af id have effekt på den variabel du kalder metoden med.

int p = 0;
int &q = p;
q++;
cout << p << endl;

Output:
1

Det vil ikke ske i den nederste.

Du kan kigge mere i din bog, hvis du har en, kig under "call-by-reference" og "call-by-value".
Avatar billede conrad Nybegynder
07. november 2003 - 22:00 #3
Hvad med den anden vej? (jeg vil gerne være 100% sikker på at jeg har forstået de her ting nu)

int& a()
{
return mya;
}

int b()
{
return mya;
}

med a() vil mya ændres

int a = a();
a = 10;//nu er mya = 10?

int b = b()
b = 11; //mya uændret?
Avatar billede arne_v Ekspert
07. november 2003 - 22:09 #4
Det her eksempel illustrerer vist:

#include <iostream>

using namespace std;

void test1(int v)
{
  v++;
}

void test2(int& v)
{
  v++;
}

void test3(int *v)
{
  (*v)++;
}

int test4()
{
  return 123;
}

static int v123 = 123;

int& test5()
{
  return v123;
}

int *test6()
{
  return &v123;
}

int main()
{
  int v = 0;
  test1(v);
  cout << v << endl;
  test2(v);
  cout << v << endl;
  test3(&v);
  cout << v << endl;
  cout << test4() << endl;
  cout << test5() << endl;
  cout << *(test6()) << endl;
  return 0;
}
Avatar billede arne_v Ekspert
07. november 2003 - 22:16 #5
Her er et tilsvarende eksempel i Java:

public class Call {
    private static void test1(int v) {
        v++;
    }
    private static void test2(MyInt v) {
        v.setV(v.getV()+1);
    }
    private static void test3(int[] v) {
        v[0]++;
    }
    public static void main(String[] args) {
        int v1 = 0;
        test1(v1);
        System.out.println(v1);
        MyInt v2 = new MyInt();
        v2.setV(0);
        test2(v2);
        System.out.println(v2.getV());
        int[] v3 = new int[1];
        v3[0] = 0;
        test3(v3);
        System.out.println(v3[0]);
    }
}

class MyInt {
    private int v;
    public int getV() {
        return v;
    }
    public void setV(int i) {
        v = i;
    }

}
Avatar billede conrad Nybegynder
07. november 2003 - 22:53 #6
Jeg kan stadig ikke se hvorfor man skal vælge den ene frem for den anden af din test5() og int test7(){ return v123;}
Avatar billede arne_v Ekspert
07. november 2003 - 22:56 #7
Der er ingen forskel på dem (test7 er det samme som test4).

Der er derimod markant forskel på test1 og test2.
Avatar billede conrad Nybegynder
07. november 2003 - 23:04 #8
Tak Arne og Søren, det er virklig et imponerende stykke "græsrods" arbejde i gør her på Eksperten.
Avatar billede conrad Nybegynder
09. november 2003 - 12:05 #9
Der er jo faktisk en forskel på test4() og test5()

int test4()
{
  return v123;//en taste fejl at det var 123 og ikke v123
}

static int v123 = 123;

int& test5()
{
  return v123;
}


da test5() = 100; jo faktisk ændrer på v123 hvorimod test4() = 100; ikke er lovlig
Avatar billede arne_v Ekspert
09. november 2003 - 12:27 #10
Det har du helt ret i.

Beklager.

Jeg har aldrig set eller brugt den konstruktion.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester