Różnica między prototypem a deklaracją

0

Witam,mam kilka pojęć które chciałbym do końca wyjaśnić,korzystałem z google ale mimo to nie jestem do końca pewien,oto one:

  1. Co to jest prototyp funkcji a jej deklaracja,jaka jest między tymi znaczeniami różnica
  2. Co to znaczy inicjalizacja, przypisanie wartości zmiennej przy deklaracji,pierwsze przypisanie zmiennej czy może ogólnie przypisywanie zmiennej jakiejś wartości?

Z góry wielkie dzięki

0

Proponowałbym kupić sobie jakąś książkę, bo to są absolutne podstawy. poza tym ja znalazłem odpowiedzi w internecie chcoażby tutaj http://binboy.sphere.pl/index.php?show=35

0

mam książke,tylko jakoś ciężko mi tam znaleźć tą informacje

0

ale tam nie ma wyjaśnione co to deklaracja funkcji,i nie wiem dalej jaka jest różnica

0
#include <iostream.h>
//prototyp funkcji max
int max(int,int,int );
int main()
{
    int x, y, z;
    cout<<"Wprowadz trzy liczby calkowite:"<<endl;
    cin>>x>>y>>z;
    cout<<"Najwieksza z tych liczb to:"<<max(x,y,z)<<endl;
    return 0;
}

//definicja funkcji max
int max(int a,int b,int c)
{
    int max=a;
    if(b>max)
        max=b;
    if(c>max)
        max=c;
    return max;
}
0

mateuszek1992 zadajesz za dużo i ( przepraszam ale ) głupie pytania. Rozumiem, że możesz czegoś nie wiedzieć to jest normalne lecz podczas programowania trzeba wykazać się kreatywnością, dociekliwością i przede wszystkim samodzielnością, a ty nie spełniasz tych wymogów. Jak czegoś nie wiesz walisz od razu na forum i czekasz na odpowiedzi. Zobacz sobie swoją działalność na 4p. Od momentu twojej rejestracji zadałeś już dużo głupich pytań, począwszy o "dobrą książkę do C", a kończąc na "Różnica między prototypem a deklaracją". To są pytania, na które uzyskasz odpowiedź przeglądając książkę bądź internet w 3 min ( no może przesadziłem. Góra dwie minuty ). Zastanów się nad tym bo zadając takie pytania daleko nie zajdziesz. Nie wspomnę już o tym, że w jednym z twoich tematów stwierdziłeś, że znasz już język programowania, więc tym bardziej takie pytania są śmieszne.

0

zgadzam się z tobą w 100 :P tylko może przez to że są wakacje i słońce troche mi się nie chce i najlepiej by mieć Od razu odpowiedz:P

1

Nie macie się co czepiać przeicież się pyta skoro nie odpowiadacie na pytanie ani nie wskazujecie na odpowiedź na innej stronie to po co pisać? Koleś się pyta widocznie dlatego ,że nie zrozumiał tego dobrze w książce albo ma jakieś wątpliwości.

Prototypy funkcji
Mówią one o tym jak funkcja będzie wyglądała czyli jakie przyjmuje parametry , co będzie zwracała i jak się nazywa.

np.

 int max(int a,int b, int c); //Prototyp funkcji max zwróci ona nam największą liczbę spośród 3 (wskazuje na to nazwa funkcji)

Definicja funkcji
Tutaj "kopiujemy Prototyp" i uzupełniamy go o to co dokładnie ta funkcja ma robić.

np.

  int max(int a,int b, int c)
{
   int maxx;
   if(a>b)
  ....//Reszta kodu
  return maxx;
}

Pytanie po co prototyp a chociaż dla takiej sytuacji

int f2()
{
  f1();//Kompilator nic nie wie o funkcji f1();
}

void f1()
{
cout << "Napis";
}

Dlatego robimy Prototyp

void f1();
int f2()
{
  f1();//Wszystko gra :)
}

void f1()
{
cout << "Napis";
}

Inicjalizacja

Inicjalizacja zmiennej polega na tym ,że przypisujemy jej daną wartość lub też zostawiamy ją sobie samą zostanie wykonany konstruktor ( http://pl.wikipedia.org/wiki/Inicjalizacj) więc jest to wykonywane tylko podczas tworzenia zmiennej dalej są to po prostu przypisania.

np.

int a =22;
int b;

Deklaracje zmiennych

Deklaracje występują:(C++)
-poza funkcją, klasą, metodą – dla zmiennych globalnych
-na początku instrukcji blokowej { } dla zmiennych lokalnych.
-jako wyrażenie w dalszych częściach instrukcji blokowej { } dla zmiennych lokalnych (nie w języku C)

(http://pl.wikipedia.org/wiki/Deklaracja_(informatyka))

Jak gdzieś jest błąd przepraszam poprawię :)

0

To pytanie moim zdaniem NIE jest aż tak głupie i oczywiste. Póki co nikt z Was jeszcze nie udzielił poprawnej odpowiedzi (!), więc nie ma co się śmiać.

Prawdę mówiąc, ja sam nie jestem pewien, czy dobrze to rozumiem. Pojęcia "prototypu" po prostu nie używam, chyba że w językach programowania, które faktycznie mają dziedziczenie prototypowe (tak jest w języku JavaScript).

Zamiast tego używam pojęcia "deklaracja".

@Gelldur:
Ty chcesz dobrze, ale piszesz o "prototypie" i podajesz kod, w którego komentarzu jest napisane jak wół słowo "deklaracja". WTF? A poniżej piszesz o deklaracji, a w kodzie jest definicja.

Następnie wspominasz o inicjalizacji, co zupełnie jest oderwane od tematu, po czym wklejasz coś z wiki. To nie jest dobra odpowiedź. Pozostałe odpowiedzi są całkowicie bezużyteczne, a ten kod, co wkleił @jaa, to z takim formatowaniem w ogóle nie powinien się znaleźć na forum programistycznym.


@mateuszek1992:

Powiem Ci, jak ja to rozumiem.

Zwykle używamy pojęcia "deklaracja" i "definicja". Deklaracja informuje kompilator tylko o sygnaturze funkcji. Czyli o tym, jakie argumenty dostaje i co zwraca. Deklaracja wygląda tak:

int sumuj(int a, int b);

Jak widzisz, nie ma tu ciała funkcji sumuj. Jest tylko informacja, że funkcja dostaje 2 inty, a sama zwraca int. Dzięki temu, gdy kompilator napotka coś takiego:

int cztery = sumuj(2, 2);

To się nie zdziwi. Powie: aha, widziałem już wcześniej deklarację funkcji sumuj. Ma ona przyjąć dwa inty -- a tutaj w tym wywołaniu dostaje 2 inty. Ma zwrócić int i tutaj faktycznie jej wynik podstawiany jest do zmiennej cztery, typu int. Wszystko się zgadza, idę dalej!

Kompilator nie wie, co ta funkcja robi, ale dzięki temu, że widział gdzieś wcześniej deklarację funkcji może sprawdzić, czy jest poprawnie wywoływana.

Deklaracji może być kilka. Muszą tylko być takie same.

Ale funkcję trzeba jeszcze zdefiniować. Powiedzieć kompilatorowi, co ona w środku robi. To właśnie mówimy, pisząc definicję:

int sumuj(int a, int b)
{
  return a + b;
}

Tutaj już widzimy, że funkcja sumuj... sumuje ;). Dana funkcja może -- i musi -- mieć w programie dokładnie jedną definicję.

I jest jeszcze jedna zasada: definicja funkcji jest jednocześnie deklaracją. Czyli jeśli gdzieś u góry kodu masz definicję funkcji, a dopiero niżej ją wywołujesz, to nie musisz nigdzie dopisywać deklaracji. Definicja już sama liczy się jako deklaracja.

Możesz więc napisać deklarację oddzielnie, a definicję mieć gdzieś na dole, o tak:

int sumuj(int a, int b); // deklaracja

int main()
{
  int wynik = sumuj(2, 2); // kompilator nie protestuje, bo zna już symbol sumuj dzięki deklaracji wyżej
  return 0;
}

int sumuj(int a, int b) // definicja
{
  return a + b;
}

Albo możesz po prostu definicję przenieść na górę -- i ona zadziała jak deklaracja, bo definicja jest jednocześnie deklaracją:

int sumuj(int a, int b) // definicja; definicja jest jednocześnie deklaracją
{
  return a + b;
}

int main()
{
  int wynik = sumuj(2, 2); // kompilator nie protestuje, bo powyższa definicja jest też deklaracją i wiadomo czym jest sumuj
  return 0;
}

Tyle gwoli wyjaśnienia, ale nie o to pytałeś.

Czym jest prototyp?

Cóż... W tym kontekście... Nie mam pewności. Wydaje mi się, że prototyp to po prostu deklaracja, ale taka, która NIE jest definicją. Czyli coś takiego:

int sumuj(int a, int b); // prototyp, ale też... deklaracja

To jest zarówno prototyp, jak i deklaracja. Jaka więc różnica? Chyba jedynie taka, że mówi się, iż definicja jest deklaracją. Ale definicja nie jest prototypem:

int sumuj(int a, int b) // definicja, czyli również deklaracja -- ale prototyp to już nie jest
{
  return a + b;
}

Nie mam pojęcia, czy się wstrzeliłem o to, o co tam chodzi. Nie używam nomenklatury "prototyp" gdy mówię o tych rzeczach. Mówię: deklaracja, definicja.

Generalnie jednak jest tak, że nikt na definicję nie mówi "deklaracja", mimo iż definicja jest też deklaracją. Za to pojęcia "prototyp" i "deklaracja" używane są wymiennie.

Dlatego ja raczej nie używam określenia "prototyp" w tym kontekście.

O prototypie mówię, gdy chodzi mi o wzorzec projektowy, o dziedziczenie prototypowe lub np. prototyp interfejsu graficznego aplikacji.

0
Gelldur napisał(a)

Nie macie się co czepiać przeicież się pyta skoro nie odpowiadacie na pytanie ani nie wskazujecie na odpowiedź na innej stronie to po co pisać? Koleś się pyta widocznie dlatego ,że nie zrozumiał tego dobrze w książce albo ma jakieś wątpliwości.

Jesteś nawet zabawny. Sam wszystko genialnie zrozumiałeś i rozwiewasz wszelkie wątpliwości:

Gelldur napisał(a)

Deklaracja funkcji
Tutaj "kopiujemy Prototyp" i uzupełniamy go o to co dokładnie ta funkcja ma robić.

np.

  int max(int a,int b, int c)
{
   int maxx;
   if(a>b)
  ....//Reszta kodu
  return maxx;
}

mimo iż w podanym przez ciebie linku do wikipedii jest napisane:

W języku C, C++ deklaracje podprogramów (nazywane prototypem) [...]

Aż chce się wkleić obrazek FACEPALM. Czytaj deklaracja funkcji i prototyp funkcji to synonimy.

A, i notka od moderatoratorów:

Ktos napisał(a)

PS Po przecinku wstawia się spację, nie odwrotnie.

Źródło: http://4programmers.net/Forum/viewtopic.php?id=163843

0

@Pajac: na dole napisałem że jak ktoś zauważy błędy to prosze poprawić to raz a dwa najzwyczajniej w świecie pomyliły mi się słowa już poprawiłem chyba jest dobrze...

@bswierczynski
"Następnie wspominasz o inicjalizacji, co zupełnie jest oderwane od tematu, po czym wklejasz coś z wiki."

Przecież w drugim pytaniu autora tematu jest:
"Co to znaczy inicjalizacja,.."

Więc pisze a co do linku z wiki daje to jako poparcie i ewentualnie aby on sam mógł sobie przeczytać wiem ,że pomyliłem słowa po przeczytaniu twojego posta zrozumiałem i rzeczywiście tamte słowa to synonimy ale już chyba dobrze poprawiłem.

0
Gelldur napisał(a)

Przecież w drugim pytaniu autora tematu jest:
"Co to znaczy inicjalizacja,.."

A to przepraszam, mój błąd. Nie zauważyłem tego drugiego pytania o_O, a tytuł tematu mówił tylko o prototypie/deklaracji.

0

mimo małej sprzeczki jaka powstała,miło spotkać takich forumowiczów jak wy,bo właśnie ciężko mi było znaleźć konkretną odpowiedz,na jednej stronie pisali tak,a na drugiej tak,i ciężko było o prawdziwą odpowiedz,inicjalizacje dokładnie już znalazłem sma w necie,ale to że troche leniwy jestem to nadal musze przyznać,bo niektóre moje tematy były troche śmieszne,to fakt:P

bswierszczynski, dzięki za ładne i proste wyjaśnienie wszystkie ale niestety to wszystko już wiedziałem wcześniej:P no ale z tego co widzę różnica pomiędzy tymi dwoma pojęciami jest malutka,o ile istnieje,także chyba już zaprzestane szukać tego info:P

0

@mateuszek1992:
IMO w tym kontekście prototypy i deklaracje to praktycznie jest to samo. Różnicę starałem się wskazać na siłę, bo zapytałeś "jaka jest różnica" pomiędzy nimi, a nie czy jakaś jest ;-).

Być może o czymś nie wiem, być może formalnie rzecz biorąc w C używa się nazwy prototyp, a w C++ deklaracja. Niczego takiego nie słyszałem, natomiast wielokrotnie słyszałem jak programiści używają tych sformułowań praktycznie wymiennie.

W innych kontekstach może być oczywiście olbrzymia różnica, bo "prototyp" ma wiele znaczeń. Może ktoś by powiedział, że napisał "prototyp funkcji" i miał na myśli to, że napisał jej wczesną wersję, taki zalążek. Nie słyszałem jednak, by ktoś używał wtedy słowa "prototyp" i na pewno nie byłoby to specjalnie techniczne, formalne określenie.

Także IMO możesz przyjąć, że różnicy pomiędzy prototypem a deklaracją funkcji nie ma. Nawet to, co napisałem w pierwszym poście, nie jest zbyt istotne. Jak ktoś zobaczy definicję funkcji i będzie się upierał przy nazywaniu jej deklaracją, bo definicja jest też deklaracją, to raczej miałby nierówno pod sufitem. Jak widzisz definicję, to mówisz "definicja". Jak widzisz prototyp (czyli zwykłą deklarację, bez ciała funkcji), to mówisz "prototyp" lub "deklaracja".

0

no i tak do tej pory myślałem:P tylko naszło mnie coś na znalezienie tej różnicy(o ile ona istnieje) jeszcze raz dzięki

0

ssman przyszedl, ale nie zauwazyl nic rażącego, więc 99% zostaje na miejscu, co rozmówcy na pewno zauważą:)

@wątek: Już to zostało powiedziane, mówiąc bardzo ogólnie:

A) deklaracja/declaration: to fragment, w ktorym mowisz, że "coś gdzieś będzie"
B) definicja/definition: to fragment, w którym to coś faktycznie mówisz, jak coś wygląda w środku
C) inicjalizacja/inicjalization: to fragment, w którym temu czemuś faktycznie nadajesz jakąś konkretną zawartość
D) "konkretyzacja" / instantiation - termin używany glownie przy template'ach, jest to miejsce, w ktorym 'krystalizujesz' szablon i nagle pojawia się konkretne wystapienie kodu wygenerowane przez szablon. słownik podpowiada "budowanie/stworzenie". mi takie tlumaczenie nie odpowiada, stad znaki zapytania.
E) specjalizacja - tez od szablonow.. ale to juz nie wazne, nie w temacie

A) deklaracja, deklaracja "w przód", forward declaration -- zapamiętaj ten angielski termin, a przestaną Ci się mylic.

  • o to mówię, będzie kiedyś (niżej, w innym pliku .cpp, itp) funkcja X zwracająca int, biorąca jakies-tam parametry.
 int X(int blah);

od tej pory, mogę wywoływać funkcję, nawet jeśli jej zawartość się nie pojawiła. najwyżej będzie błąd linkera, nie kompilacji

  • o to mówię, będzie kiedyś (niżej, w innym pliku .cpp, itp) zmienna globalna Z zawierająca int
 extern int Z;

od tej pory, mogę używać tej zmiennej, nawet jeśli jej miejsce fizycznego umieszczenia jeszcze się nie pojawiło. najwyżej będzie błąd linkera, nie kompilacji

B) definicja, ciało, treść, fizyczne miejsce wystąpienia. jest to polaczenie deklaracji oraz "ustalenia konstrukcji wnetrza".

  • a teraz mówię, zupełnie gdzieś indziej, że funkcja X ma do parametru dodac 1 i to zwrocic
 int X(int blah)
{   return blah + 1;
}

stworzylem wiec wlasnie wlasciwa funkcje. od tej pory bledy linkera jej dotyczace przestana sie pojawiac -- gdyz dopiero piszac to, ona faktycznie zaistniala w programie

  • a teraz mówię, zupełnie gdzieś indziej, że Z ma byc fizycznie umieszczone tutaj, w tym module .cpp
 int Z; 

stworzylem wiec wlasnie wlasciwa zmienna globalna, ktora (może) zostać wyeksportowana poza moduł. od tej pory linker bedzie spinal deklaracje zmiennej globalnej INT-Z z innych modulow z tym tutaj wystapieniem

C) inicjalizacja, nadanie wartosci, nadanie tresci, sprawienie ze coś w końcu ma określoną zawartosc.

  • a teraz mówię, niech Z zacznie od zawierania 15.
 Z = 15; 

to jest inicjalizacja, pierwotne nadanie sensu/tresci czemus tam *)

D) pomijam. kiedyś się z tym zderzysz, niech to będzie później

Niby to to jasne i proste, ale jednak uzycie ich w niektorych miejscach moze sie wydawac troche niespojnie. Na szczescie zawsze w danym miejscu znaczą jedno i to samo. A, no i w niektórych połączeniach nie mają sensu.

UWAGA: ponizej pojawiaja sie przypisy * oraz **. Pierwszy z nich nalezy przeczytac jesli nie widzi sie roznicy miedzy inicjalizacja a przypisaniem. Drugi z nich -- jesli chce sie dowiedziec o co chodzi z owa "niespojnoscia" i czemu tak wlasciwie to jej nie ma. Nie polecam czytania ** chyba, ze komus te terminy juz sie przestaly mylic i chce zeby znowu zaczely:)

  • deklaracja zmiennej globalnej - OK -- opisalem powyzej

  • definicja zmiennej globalnej - OK -- opisalem powyzej

  • inicjalizacja zmiennej globalnej - OK -- opisalem powyzej, z haczykiem

  • deklaracja zmiennej lokalnej - NIE MOŻLIWA -- napisanie "int X;" w funkcji będzie definicją. nie da się wyrazic lokalnej deklaracji zmiennej

  • definicja zmiennej globalnej - OK -- normalne "int X;" w funkcji **)

  • inicjalizacja zmiennej globalnej - OK -- normalne "int X = 5;" w funkcji **)

  • deklaracja funkcji globalnej -- OK - nazywa się je tez forward-declaration (w C++) albo prototypem (w C) albo czasem tez "sygnaturą", przyklad opisalem powyzej

  • definicja funkcji globalnej -- OK - czyli tresc, bebechy takiej funkcji, przyklad opisalem powyzej **)

  • inicjalizacja funkcji globalnej -- BEZ SENS - funkcje nie maja "zawartosci" "konkretniejszej" niz ich wewnetrzna budowa ustalona w definicji **)

  • XXX funkcji lokalnej -- f.lokalne nieistnieja. W C0x/x0 dochodzą lambdy, ale to nie to samo

  • deklaracja klasy -- OK - nazywa się je tez forward-declaration (w C++), "class X;"

  • definicja klasy -- OK - czyli tresc, bebechy takiej klasy "class X{ ..... };" **)

  • inicjalizacja klasy -- BEZ SENS - klasy nie maja "zawartosci" "konkretniejszej" niz ich wewnetrzna budowa ustalona w definicji **)

  • deklaracja członka klasy -- OK - ale jest mozliwa tylko podczas definiowania klasy "class X { ...tylkotutaj... };"

  • definicja członka klasy -- OK - mozliwa w definicji klasy, lub poza: "class X{ int bum(){return 0;}};" lub "int X::bum(){return 0;}". z kolei dla pol - tylko statycznych: "int X::iks;", dla niestatycznych - bezsensu

  • inicjalizacja członka klasy -- OK - dla metod bezsens na mocy bezsensu inicjalizacji funkcji **), dla pól mozliwa w liscie inicjalizacyjnej konstruktorow np.: " X::X() : iks(5) {....} " lub dla pol statycznych np: "int X::iks = 5;"

i temu podobne.. przypadkow wystapienia tych terminow jest wiecej, ale szczerze mowiac juz mi sie nie chce tego rozpisywac. te przyklady powinny wystarczyc do ich "zalapania".

....
A przy szablonach dochodzi jeszcze 'instantiacja' instantiation gdyz definicja szablonu nie jest rownoznaczna z definicja jakiejkolwiek klasy. Nawet specjalizacja szablonu nie koniecznie prowadzi do niej, tylko tworzy nową, pochodną definicję innego, bliźniaczo podobnego szablonu.. Niesamowicie specyficzne miejsce, w którym nagle na podstawie definicji szablonu kompilator tworzy automatycznie faktycznie jedną lub więcej definicji jednej lub więcej klas opisanych tym szablonem - nazywa sie "instantiation"/wywolaniem/wystapieniem/konkretyzacją/krystalizacja/(..). Miejsca te moga byc "implicit" lub "explicit". Te pierwsze sa 'automatyczne', po cichu, i zapominamy o tym ze w ogole istnieja, np. "vector<int> tabelka;". Te drugie sa napisane wyraznie przez programiste, z jakiegos zawilego powodu. Np: "template std::vector<int>;" - nakazuje kompilatorowi wygenerowac taka definicje klasy (vector-po-int) nawet jesli kompilatorowi wydaje się ze zaden kod jej nie uzywa.. Teraz to skojarz z wielomodułowościa, czyli 50cioma plikami .cpp i .hpp, możliwościa kompilacji plików .cpp do modułów .o/bibliotek .a lub .lib/bibliotek dynamicznych .so lub .dll/itp i może już przeczuwasz gdzie czasem tego trzeba użyć i czemu czasem "wygenerowany ale nieuzywany" jest potrzebny..

*) Inicjalizacja różni się przypisania 'tylko' LOGICZNIE: jesli zdefiniujesz zmienna mozesz czesto natychmiast jej nadac wartosc w tej samej linii. bedzie to linijka z "definicja i inicjalizacja", wszystkie nastepne z=1111 to beda juz tylko zwykle przypisania. Jesli jej nie nadasz wartosci w tej samej linii, tylko pozniej, to linijka ta będzie tylko definicją, zmienna będzie stworzona jako niezainicjalizowana. Pozniej, pierwsze przypisanie z=444 na ktore program trafi zainicjalizuje ją, ale NIE bedzie inicjalizacja. Bedzie to zwykle przypisanie, ktore "naprawi" niezainicjalizowana zmienna.. "LOGICZNIE", myślowo, o takim miejscu tez sie mowi ze jest to inicjalizacja zmiennej Z, gdyz jest to pierwsza jej sensowna wartosc, jednak faktycznie tak nie jest. Zmienne mozna zdefiniowac-i-inicjalizowac, albo zdefiniowac-bez-inicjalizacji a potem przypisac im nowa wartosc.

**) niby-niespojnosc. "deklaracja" funkcji mowi o jej wygladzie zewnetrznym (typ, nazwa), "definicja" o wewnetrznym (kod), inicjalizacji brak. dla zmiennych, "deklaracja" mowi o jej wygladzie zewnetrznym (typ, nazwa), "definicja" o miejscu wystąpienia, a inicjalizcja nadaje wartosc.. Funkcja nie ma swojej wartosci? A 'miejsce wystapienia' to jej kod? niespojne nazwy definicja-inicjalizacja?
Otóż, wszystko się zgadza, tylko zostało źle opisane, gdyż piszac to patrzylem ze zlej strony.. Nazwy te zostaly ukute dla zmiennych, i dla funkcji tez pasuja idealnie, tylko nalezy spojrzec od strony kompilatora i linkera. Wartością funkcji, jest jest kod. Miejsce w ktorym piszesz cialo funkcji jest miejscem jej definicji-i-inicjalizacji. Definicji, gdyz kompilator tworzy kod wtymmodule, czyli to jest jej wystapienie. Inicjalizacji, gdyz natychmiast ta funkcja dostaje konkretna zawartosc - swoj kod. Ot, roznica miedzy nimi z zmiennymi globalnymi w tym, ze sa wywolywalne i nie-przypisywalne. Raz "zainicjalizowanej" funkcji nie zmienisz na nowa. Kod zawsze tam zostanie niezmieniony. W kazdym bądz razie, tak jakby. Mozna "inicjalizacje funkcji" luzno skojarzyc przez kontrast z purevirtual czyli metodami-bez-tresci..
analogiczna uwaga tyczy sie klas z tym ze... nalezy uwazac, gdyz definicja-i-inicjalizacja klasy postaci "class X{ int bumbum(); int iks; };" jest ustaleniem się wnetrza klasy ale ... nie robi nic. A dokladniej, robi deklarację metody 'bumbum' oraz deklaracje pola iks. Dopiero zapis: "class X{ int bumbum() {return iks+1;} int iks; };" faktycznie cos by zdefiniowal -- metodę "bumbum". Pole 'iks' dalej jest tylko zadeklarowane, nie ma ono zadnego fizycznego miejsca dla siebie... Dopiero gdy stworzysz OBIEKT tej klasy, to to pole faktycznie zaistnieje..

//edit: widze, ze tak dlugo to pisalem, ze az juz sie dyskusja skonczyla:) no coz, moze komus sie przyda potem:)
//edit2: Fanael podsunał mi tłumaczenie instantiation->konkretyzacja. IMHO troche za łatwe do pomylenia ze specjalizacją, ale wierze na slowo gdyz sam nie pamietam i ciagle uzywam angielskiego terminu:)

0
quetzalcoatl napisał(a)

ssman przyszedl,

No chyba nie chowasz urazy? Głupio byłoby, abym przez taką syczącą grę słów miał teraz przeje*ane.

quetzalcoatl napisał(a)

ale nie zauwazyl nic rażącego, więc 99% zostaje na miejscu, co rozmówcy na pewno zauważą.

Ale zawsze zostaje ten 1% i jest to ten mój procent, z mojego postu w którym miałem rację: konfident przyleciał z płaczem.

0
Bury pajac napisał(a)
quetzalcoatl napisał(a)

ssman przyszedl,
No chyba nie chowasz urazy? Głupio byłoby, abym przez taką syczącą grę słów miał teraz przeje*ane.

ja? skądże. na końcu tamtego zdania miałbyć ":)", ale byłem za bardzo zajęty reszta i wsiąkł

quetzalcoatl napisał(a)

ale nie zauwazyl nic rażącego, więc 99% zostaje na miejscu, co rozmówcy na pewno zauważą.
Ale zawsze zostaje ten 1% i jest to ten mój procent, z mojego postu w którym miałem rację: konfident przyleciał z płaczem.</quote>
Spokojnie.. nie chodziło o treść tylko formę.. wywaliłem fragment postu Gelldura, więc u Ciebie też musiałem to wywalić/zmienić.
Btw. na ten Twoj/mój post Gelldur znowu rzucił mięsem, zobaczymy go za 12 godzin oddechu.

0
quetzalcoatl napisał(a)

Btw. na ten Twoj/mój post Gelldur znowu rzucił mięsem, zobaczymy go za 12 godzin oddechu.

Znowu zmuszał do zjedzenia tego jego siana? Nie wiem jak u niego, ale moja mama dobrze gotuje.
Chyba go trochę za ostro potraktowałeś, jest nieszkodliwy. No chyba że przecinki znowu były źle, to wtedy mu się należało.

0

C) inicjalizacja, nadanie wartosci, nadanie tresci, sprawienie ze coś w końcu ma określoną zawartosc.

  • a teraz mówię, niech Z zacznie od zawierania 15.
 Z = 15; 

to jest inicjalizacja, pierwotne nadanie sensu/tresci czemus tam *)

@quetzalcoatl
Kolego, to jest niestety błędna informacja. Ty piszesz o przypisaniu, a w przykładowym kodzie podajesz definicję z inicjalizacją. Jeżeli tworzysz jakąś zmienną (definiujesz ją, czyli powstaje ona w pamięci komputera), to w tym samym momencie możesz jej nadać jakąś wartość - to jest inicjalizacja. W każdym innym wypadku nie masz do czynienia z inicjalizacją. Jeżeli tego nie zrobisz, to w następnej instrukcji masz już tylko możliwość wykonania przypisania nowej wartości do tej zmiennej. Pamiętaj, że w zmiennej zawsze jest jakaś wartość (nieokreślony rozkład bitów dla zmiennych automatycznych).

0

... wybaczcie, sprostowanie:

@quetzalcoatl
Napisałeś definicję zmiennej Z. W drugiej instrukcji napisałeś instrukcję przypisania do zmiennej Z. To nie jest w żadnym wypadku inicjalizacja.

0

Ogólnie wiem że wątpliwe źródło, ale

http://pl.wikipedia.org/wiki/Inicjalizacja_zmiennej napisał(a)

Inicjalizacja zmiennej w kodzie jest zwykłą konstrukcją nadania wartości zmiennej, niczym nie różniącą się od dalszych, kolejnych przypisań nowych wartości.

Definicja zmiennej nie jest jej inicjalizacją! To że ją definiujesz i dostaje ona zupełnie przypadkowo jakiś ciąg śmieciowych danych ze stosu nie powoduje że jest zainicjalizowana!

Polecam zastanowić się np. nad terminem "niezainicjalizowane wskaźniki"

(btw. firefox nie zna słowa inicjalizacja... )

0
MSM napisał(a)

Definicja zmiennej nie jest jej inicjalizacją! To że ją definiujesz i dostaje ona zupełnie przypadkowo jakiś ciąg śmieciowych danych ze stosu nie powoduje że jest zainicjalizowana!

To w takim razie to czym jest ?

static int bob;

Moim zdaniem w tym przypadku deklaracja zmiennej bob jest takze definicja oraz inicjalizacja ;p Przynajmniej na takim poziomie abstrakcji, nie zaglebiajac sie nizej.

0

@t0m_k-tmp
Czepiasz się ;)
Wystarczy nie doprecyzować czegoś i od razu wychodzi nie to co powinno.

Ogólnie temat tego wątku jest prosty jak budowa cepa ale równie prosto można popełnić błąd używając tej terminologii. Ja się też pomyliłem ;)
Pozdrawiam wszystkich.

P.S.
Niby temat banał, a może ktoś, kto myśli, że dobrze myśli, tak faktycznie, to źle myśli? :D

0
Moss napisał(a)

C) inicjalizacja, nadanie wartosci, nadanie tresci, sprawienie ze coś w końcu ma określoną zawartosc.

  • a teraz mówię, niech Z zacznie od zawierania 15.
 Z = 15; 

to jest inicjalizacja, pierwotne nadanie sensu/tresci czemus tam *)

@quetzalcoatl
Kolego, to jest niestety błędna informacja. Ty piszesz o przypisaniu, a w przykładowym kodzie podajesz definicję z inicjalizacją. Jeżeli tworzysz jakąś zmienną (definiujesz ją, czyli powstaje ona w pamięci komputera), to w tym samym momencie możesz jej nadać jakąś wartość - to jest inicjalizacja. W każdym innym wypadku nie masz do czynienia z inicjalizacją. Jeżeli tego nie zrobisz, to w następnej instrukcji masz już tylko możliwość wykonania przypisania nowej wartości do tej zmiennej. Pamiętaj, że w zmiennej zawsze jest jakaś wartość (nieokreślony rozkład bitów dla zmiennych automatycznych).

Kolego, mam nadzieje ze przeczytales caly moj post, takze z gwiazdkami oraz linijka z napisem "UWAGA", ale zwlaszcza gwiazdką pierwszą, i ze rozumiesz roznice w konstruowaniu wypowiedzi tlumaczacych banały i koncepcje, a wypowiedziami definiujacymi formalizmy.
W gwiazdce pierwszej znajdziesz wytlumacznenie postrzegania/rozpoznawania roznicy, gdyz termin "inicjalizacja" nie jest az tak banalny - mozna go rozumiec dwojako i faktycznie w obudwu przypadkach sie go uzywa.

:)

0

@quetzalcoatl
Masz rację, zamotałem się czytając trochę Twój post :)
Tak, w części z gwiazdką prawdę piszesz. Chodzi o to, że przykład z C) podałeś błędny bo to jest przypisanie. Jeżeli ktoś czyta Twój post, to może zobaczyć niespójność między tym co w C), a tym co w *), a jak mniemam pyta o to osoba, która nie wie o co chodzi.

Inicjalizacja i przypisanie są banalne. Nie ma co udziwniać i zamęcać tematu,
Wystarczy krótko:
przypisanie - nadanie jakiejś wartości ale nie w miejscu definicji.
inicjalizacja - nadanie wartości początkowej (tylko i wyłącznie w miejscu definicji).
Coś pominąłem?
Trzymając się tej terminologii, chcę zauważyć, że stałe np:
const int i = 10;
mogą być tylko i wyłącznie inicjalizowane. I tutaj ten termin jest tym bardziej znaczący.

Problem, to czasami może wyniknąć ze sposobu odczytywania przez nas kodu, np:
zmienna "niezainicjalizowana" wcale nie musi mieć niesensowną wartość.
Prosty przykład:
{
int tab[2];
int i;
tab[2] = 10;
cout << "i=" << i;
}

Z premedytacją wyszedłem poza zakres tablicy. Wartość zmiennej "i" jest 10 choć była tylko zdefiniowana (bez inicjalizacji). Tutaj zaszło raczej coś w stylu niejawnego przypisania. No ale to są już niuanse. Aczkolwiek interesujące :)
To akurat sprawdzałem na kompilatorach GCC oraz ICPC. Być może inne kompilatory produkują inny kod.
Poza książkami i artykułami na necie polecam czytanie standardu C++. Czasami w książkach są błędy!
Pozdrawiam :)

0

Nie ma tam nic niejawnego - po prostu fartem trafiłeś na i wpisując wartość w miejsce adresu tab+2. Trafiłeś na swoją pamięć, więc programu nie wywaliło.

0

Z tym, ze ta zmienna i jest przed tablica w pamieci, bo masz zmienne na stosie, wiec patrz odwrotnie. Wypisz sobie zmienna i, a zobaczysz, ze nie ma 10.

Dowod:

004012FA  |. C745 00 0A0000>MOV DWORD PTR SS:[EBP],0A
00401301  |. C745 F4 000000>MOV DWORD PTR SS:[EBP-C],0

dla:

int tab[2];
int i;

tab[2] = 10;
i = 0;

Tego cout nie zauwazylem piszac poprzedniego posta, wiec pewnie wyswietliles zawartosc, ale nie wiem dlaczego masz w i 10 skoro zapis jest w dwa rozne miejsca.

0

IMHO, pewnie zobaczyl 10, poniewaz kompilator ma prawo sobie zmienne w ramce funkcji poukladac dokladnie dowolnie.. jego kompilator mogl umiescic "int i" na koncu

Mosss napisał(a)

podałeś błędny bo to jest przypisanie (...)
....
Poza książkami i artykułami na necie polecam czytanie standardu C++. Czasami w książkach są błędy!

Nie wiem czemu, ale sadzac po ciaglych sformulowaniach typu "błędne" oraz sugerowaniu (nie wiem, czy akurat mi, czy ogolnie czytelnikom forum?) poczytania standardu, mam coraz wieksze wrazenie ze sie nie rozumiemy, albo probujesz na sile sie do czegos przyczepic poprzez sztuczna restrykcyjnosc co do nazwenictwa i logicznej budowy wypowiedzi..

Napisalem tak jak napisalem, poniewaz zakladam ze czytajacy ZNA roznice miedzy inicjalizacja a przypisanie i widzac "bum=ble" wie, ze zaleznie od kontekstu, mozna to rozumiec dwojako. Tym ktorym nie widza roznicy, napisalem gwiazdke, poniewaz zakladalem ze zaraz ktos przyleci i zacznie marudzic ze "to nie jest inicjalizacja".. Sadzilem ze opis w gwiazdce rozwieje watpliwosci, co moze byc inicjalizacja, a co nia by byc nie moglo..

Jesli czepiamy sie szczegolow, to nie jest prawidlowy kod C/C++ poniewaz nie jest zamkniety w zadnej funkcji.

Jezeli czepiamy sie szczegolow - nigdzie nie napisalem ze w tym wycinku kodu, X jest zmienna typu INT, ani nawet nie napisalem ze jest to cala linijka.. cala linka mogla brzmiec "moj_ulubiony_intByCtorConvertible_typ_danych<od_bum, ble, ivector<bam>> x = 5;", to, tylko ucialem 80% linijki dla pogladowosci zapisu..

Jesli czepiamy sie szczegolow, to ja na przyklad moge teraz sie dla kontry zaczac upierac ze "inicjalizacja" explicite powinna miec postac konstrukcji i wygladac na przyklad tak: int x(5); miast int x = 5, poniewaz wtedy wszystko jest 100% jasne nawet dla poczatkujacego, a w tym typowym przypadku numer dwa, to jedynie "inteligentny" kompilator "po prostu" wie, ze to jest teraz pierwsze przypisanie i je "optymalizuje":) ( <-- zdanie poprzedzajace jest napisane rownie mało formalnie jak wszystko poprzednie i piszac je, zakladam ze rozmawiam z osoba ktora C++ zna na poziomie wystarczajaco dobrym, zeby zauwazyc ze ma ono forme zdawkowa:) ).

Czepiajac sie w ten sposob szczegolow dalej, przy kodzie brzmiacym:

int x; // A
blahblah-nie-uzywajace-x
blahblah-nie-uzywajace-x
x = 5;  // B
blahblah-uzywajace-x
cout << x

kompilator przy wlaczonych optymalizacjach, przy pewnych spelnionych warunkach (np. ze blahblah-nie-uzywa-x faktycznie NIE uzywa X), ma prawo przestawic sobie wiersze kodu B blizej A, ba, moze zlepic sobie linie A i B tworzac "inicjalizacje" zamiast przypisania. Itp itd.

Dlatego w opisie skrotowym szczegoly kompletnie olałem i umieściłem gwiazdkę, wyjaśniającą różnicę między inicjalizacją-składniową a inicjalizacją-logiczną. Jeżeli nie wyrozróżniasz tych dwóch jako odrebne terminy i upierasz się, że tylko ta inicjalizacja-składniowa ma byc nazwana "inicjalizacją" -- to w ten sposób możemy dyskutować bardzo długo, ponieważ "zamek" może być zarówno w spodniach jak i w górach na niedostępnej skale i na próżno tłumaczyć że on może być co najwyżej ceglany a nie wszywany na szybko fastrygą.

Jeżeli zas w przypadku A) z kodu tuż powyżej przyłapiesz się na nazywaniu "niezainicjalizowanej-zmiennej", to równie dobrze pewnienazwiesz/możesznazwać przypadek B -- inicjalizacją tejże zmiennej. Popatrz teraz ponownie dokladnie na te linijkę B i zastanow sie, dlaczego piszac hen-dawno-temu-w-tamtym-poscie podobna temu linijke, kompletnie swiadomie olałem pisanie jakiegos potworka w stylu ".... x = 5" czy "??? x = 5" czy "int x = 5" czy "Typ x = 5" itip, i czemu przy tym podałem gwiazdkę z objasnieniem init-log vs. init-syntax..

@cos pominalem - tak, ale drobny szczegolik - lista inicjalizacyjna w .ctor'ach okresla inicjalizacje oderwana od miejsca definicji pol obiektu klasy, gdyz w definicjach klas defacto nie mozna inicjalizowac definiowanych pol inline'owo, za wyjatkiem statycznych stalych typu calkowitoliczbowego, więc to co napisałeś w nawiasie prawdą nie jest (nawet jeśli założyć ze pojęcie "inicjalizacja" odnosi sie tylko do inicjalizacji-składniowej), jeżeli zwracać uwagę na wszystkie możliwe konstrukcje składniowe, a nie tylko definiowanie zmiennych lokalnych funkcji/metod. (<-- to napisalem w miare formalnie, mam nadzieje ze widac roznice w stylu i szczegolowosci:) )

mam nadzieję że rozwiałem już Twoje wątpliwości co do mojego IQ i znajomości C++, w tym jego standardu, ponieważ szczerze mówiąc, nie widzę żadnego celu ani zysku z tej dyskusji.. Jeżeli upierasz się że tam-kufaa-jest-bląd, spokojnie - mogę przed tamtym identyfikatorem zmiennej na przykład dostawić trójkropek żeby nie udawało całej linijki, mogę zdublować tamten kod razy N wyjaśniając na miejscu wszystkie mozliwe cztery-czy-więcej sposoby inicjalizacji, albo zdawkowo zastapic ten kod zamykającąwszelkiedyskusjeiniejasnosci inicjalizacją "w stylu konstrukcyjnym"... - ale szczerze mimo ze mnie wtedy korcilo, nie uzylem akurat jej, zeby potem ludzie nie dziwili sie ze maja kolizje z lokalnymi (re)definicjami funkcji jak im sie nazwa zmiennej z nazwą typu skrzyzuje..

0
quetzalcoatl napisał(a)

IMHO, pewnie zobaczyl 10, poniewaz kompilator ma prawo sobie zmienne w ramce funkcji poukladac dokladnie dowolnie.. jego kompilator mogl umiescic "int i" na koncu

Mogl to poustawiac dowolnie i moze rzeczywiscie zbyt pochopnie o tym napisalem. Nie pomyslalem o kolejnosci w pierwszej chwili, poniewaz w sumie nawet nie przypominam sobie, zebym kiedykolwiek spotkal sie z kodem gcc, w ktorym zmienne lokalne nie ida po kolei. W kazdym razie obadam sobie to jak bede mial chwilke.

1 użytkowników online, w tym zalogowanych: 0, gości: 1