Dlaczego const-poprawność jest specyficzna dla C++?

Disclaimer: zdaję sobie sprawę, że istnieją dwa pytania na temat przydatności const-poprawności, jednak nikt nie mówił, jak const-poprawność jest niezbędna w C++ w przeciwieństwie do innych języków programowania.Nie jestem również zadowolony z odpowiedzi udzielonych na te pytania.

Używałem teraz kilku języków programowania i jedna rzecz, która mnie denerwuje w C++, to pojęcie const-poprawności. Nie ma takiego pojęcia w Javie, C#, Pythonie, Ruby, Visual Basic itp., to wydaje się być bardzo specyficzne dla C++.

Zanim skierujesz mnie do C++ FAQ Lite, przeczytałem go i mnie to nie przekonuje. Doskonale poprawne, niezawodne programy są pisane w Pythonie cały czas i nie ma słowa kluczowego const lub równoważnego. W Javie i C# obiekty mogą być deklarowane jako końcowe (lub const), ale nie ma funkcji składowych const ani parametrów funkcji const. Jeśli funkcja nie musi modyfikować obiektu, może przyjąć interfejs, który zapewnia tylko dostęp do odczytu obiektu. Że technika może być również stosowana w C++. Na dwóch rzeczywistych systemach C++, nad którymi pracowałem, było bardzo mało użycia const wszędzie i wszystko działało dobrze. Więc jestem daleki od tego, by pozwolić const zanieczyścić bazę kodową.

Zastanawiam się, co w C++ czyni const koniecznym, w przeciwieństwie do innych języków programowania.

Do tej pory widziałem tylko jeden przypadek, w którym const musi być użyty:

#include <iostream>

struct Vector2 {
    int X;
    int Y;
};

void display(/* const */ Vector2& vect) {
    std::cout << vect.X << " " << vect.Y << std::endl;
}

int main() {
    display(Vector2());
}

Kompilowanie tego z const commented out jest akceptowane przez Visual Studio, ale z warning C4239 , niestandardowe rozszerzenie używane. Tak więc, jeśli chcesz zwięzłości składniowej przekazywania w czasownikach, unikania kopii i pozostawania zgodnym ze standardami, musisz przejść obok const reference, nie ma mowy o tym. Mimo to jest to bardziej dziwactwo niż podstawowy powód.

W Przeciwnym Razie, nie ma sytuacji, w której const musi być użyty, z wyjątkiem połączenia z innym kodem, który używa const. Const wydaje mi się mało inne niż zadufana w sobie plaga, która rozprzestrzenia się na wszystko, czego dotknie :

Powodem, dla którego const działa w C++ jest bo możesz to odrzucić. Jeśli couldn ' t cast it away, then your world byłoby do dupy. Jeśli zadeklarujesz metodę to wymaga const Bla, można zdać to nie-const Bla. Ale jeśli to w drugą stronę nie możesz. jeśli declare a method that takes a non-const Bla, you can ' t pass it a const Bla. Więc utknąłeś. Więc ty stopniowo potrzeba wersja const wszystko, co nie jest const, a Ty skończyć w świecie cieni. W C++ you ujdzie to na sucho, bo jak z wszystko w C++ jest czysto opcjonalne czy chcesz ten czek, czy nie. Możesz po prostu rozwalić konsternację jeśli ci się nie podoba.

Anders Hejlsberg (C # architect), CLR Design Choices

Author: Asik, 2009-09-03

14 answers

Const poprawność zapewnia dwie znaczące zalety C++, z których jedna czyni go raczej unikalnym.

  • pozwala na wszechobecne wyobrażenia zmiennych / niezmiennych danych bez konieczności stosowania wielu interfejsów. Poszczególne metody mogą być notowane, czy mogą być uruchamiane na obiektach const, a kompilator wymusza to. Tak, Czasami może to być kłopotliwe, ale jeśli używasz go konsekwentnie i nie używasz const_cast masz sprawdzone bezpieczeństwo kompilatora w odniesieniu do zmienny vs. dane niezmienne.
  • jeśli obiekt lub pozycja danych jest const, kompilator może swobodnie umieścić go w pamięci tylko do odczytu. Może to mieć szczególne znaczenie w systemach wbudowanych. C++ obsługuje to; kilka innych języków to robi. Oznacza to również, że w ogólnym przypadku nie można bezpiecznie wyrzucić const, chociaż w praktyce można to zrobić w większości środowisk.

C++ nie jest jedynym językiem z poprawnością const lub czymś w tym rodzaju. OCaml i Standard ML mają podobną koncepcję z inną terminologią-prawie wszystkie dane są niezmienne (const), a gdy chcesz, aby coś było zmienne, używaj innego typu (A ref type), aby to osiągnąć. Więc jest to po prostu unikalne dla C++ w sąsiednich językach.

Wreszcie, idąc w innym kierunku: były czasy, kiedy chciałem const w Javie. final czasami nie idzie wystarczająco daleko, jeśli chodzi o tworzenie niezmiennych danych (zwłaszcza niezmiennych widoków zmiennych danych) i nie chce tworzyć interfejsów. Spójrz na niezmodyfikowaną obsługę kolekcji w Java API i fakt, że sprawdza ona tylko w czasie wykonywania, czy modyfikacja jest dozwolona dla przykładu, dlaczego const jest użyteczny (lub przynajmniej struktura interfejsu powinna być deepend, aby mieć List i MutableList) - nie ma powodu, aby próba zmutowania niezmiennej struktury nie mogła być błędem typu kompilacji.

 63
Author: Michael Ekstrand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-02 21:06:20

Chyba nikt nie twierdzi, że const-poprawność jest "konieczna". Ale znowu, zajęcia też nie są naprawdę konieczne, prawda? To samo dotyczy przestrzeni nazw, WYJĄTKÓW,... rozumiesz.

Const-poprawność pomaga wychwycić błędy podczas kompilacji i dlatego jest przydatna.

 28
Author: Nemanja Trifunovic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-02 21:05:18

Const to sposób na wyrażenie czegoś. Byłoby to przydatne w każdym języku, jeśli uważasz, że ważne jest, aby wyrazić. Nie mają tej funkcji, ponieważ projektanci języka nie uznali ich za przydatne. Gdyby ta funkcja tam była, myślę, że byłaby równie przydatna.

Myślę o tym jak o throw specifications w Javie. Jeśli ci się podobają, prawdopodobnie spodoba ci się w innych językach. Ale projektanci innych języków nie myśleli, że to ważne.

 15
Author: Lou Franco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-02 21:03:39

Masz rację, const-poprawność nie jest konieczna. Z pewnością możesz napisać cały kod bez słowa kluczowego const i zacząć działać, tak jak w Javie i Pythonie.

Ale jeśli to zrobisz, nie otrzymasz już pomocy kompilatora w sprawdzaniu naruszeń const. Błędy, o których kompilator powiedziałby Ci w czasie kompilacji, zostaną teraz znalezione tylko w czasie wykonywania, jeśli w ogóle, a zatem zajmie ci więcej czasu, aby zdiagnozować i naprawić.

Dlatego, starając się obalić lub uniknąć const-poprawność funkcja jest po prostu utrudnianie rzeczy dla siebie w dłuższej perspektywie.

 13
Author: Jeremy Friesner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-02 21:06:14

Cóż, Zajęło mi 6 lat, aby naprawdę zrozumieć, ale teraz mogę w końcu odpowiedzieć na własne pytanie.

Powód C++ ma "const-poprawność" i że Java, C#, itp. nie, czy C++ obsługuje tylko typy wartości , a te inne języki obsługują tylko lub przynajmniej domyślnie typy referencyjne .

Zobaczmy, jak C#, język, który domyślnie używa typów referencyjnych, radzi sobie z niezmiennością, gdy chodzi o typy wartości. Powiedzmy, że masz zmienną wartość typ i inny typ, który ma pole readonly tego typu:

struct Vector {
    public int X { get; private set; }
    public int Y { get; private set; }
    public void Add(int x, int y) {
        X += x;
        Y += y;
    }
}

class Foo {
    readonly Vector _v;
    public void Add(int x, int y) => _v.Add(x, y);
    public override string ToString() => $"{_v.X} {_v.Y}";
}

void Main()
{
    var f = new Foo();
    f.Add(3, 4);
    Console.WriteLine(f);
}

Co powinien zrobić ten kod?

  1. nie można skompilować
  2. print "3, 4"
  3. print "0, 0"

ODPOWIEDŹ to # 3. C# próbuje uszanować słowo kluczowe "readonly", wywołując metodę Add na odrzucanej kopii obiektu. To dziwne, tak, ale jakie inne opcje ma? Jeśli wywoła metodę na oryginalnym wektorze, obiekt zmieni się, naruszając "readonly" - ness pole. Jeśli nie uda się skompilować, to readonly value type members są dość bezużyteczne, ponieważ nie można na nich wywołać żadnych metod, ze strachu, że mogą zmienić obiekt.

Gdybyśmy tylko mogli określić, które metody są bezpieczne do wywołania na instancjach readonly... Czekaj, właśnie takie są metody const w C++!

C# nie przejmuje się metodami const, ponieważ nie używamy typów wartości tak często w C#; po prostu unikamy zmiennych typów wartości (i deklarujemy je jako "złe", zobacz 1 , 2).

Również typy referencji nie cierpią z powodu tego problemu, ponieważ gdy oznaczysz zmienną typu referencji jako readonly, to, co jest readonly, to odniesienie, a nie sam obiekt . Jest to bardzo łatwe do wymuszenia przez kompilator, może oznaczyć każde przypisanie jako błąd kompilacji, z wyjątkiem inicjalizacji. Jeśli używasz tylko typów referencyjnych, a wszystkie pola i zmienne są tylko odczytywane, możesz uzyskać niezmienność wszędzie przy niewielkim koszcie składniowym. F # działa zupełnie jak to. Java unika problemu, po prostu nie obsługując typów wartości zdefiniowanych przez użytkownika.

C++ nie ma pojęcia "typy referencyjne", tylko "typy wartości" (w C#-lingo); niektóre z tych typów wartości mogą być wskaźnikami lub referencjami, ale podobnie jak typy wartości w C#, żaden z nich nie posiada własnego magazynu. Gdyby C++ traktował "const" na swoich typach tak, jak C# traktuje "readonly" na typach wartości, byłoby to bardzo mylące, jak pokazuje powyższy przykład, nie zważając na paskudną interakcję z kopią konstruktorów.

Więc C++ nie tworzy kopii odrzuconej, bo to spowodowałoby niekończący się ból. Nie zabrania ci też wywoływania żadnych metod na członkach, ponieważ, cóż, język nie byłby wtedy zbyt przydatny. Ale nadal chce mieć pojęcie "readonly" lub "const-ness".

C++ próbuje znaleźć środkowy sposób, zmuszając cię do oznaczania, które metody są bezpieczne do wywoływania członków const, a następnie ufa ci, że byłeś wierny i dokładny w etykietowaniu i wywołaniach metody bezpośrednio na oryginalnych obiektach. To nie jest idealne - to gadatliwe, i możesz naruszać const-ness tak bardzo, jak chcesz - ale to prawdopodobnie lepsze niż wszystkie inne opcje.

 10
Author: Asik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:07

Programowanie to pisanie w języku, który zostanie ostatecznie przetworzony przez komputer, ale jest to zarówno sposób komunikacji z komputerem, jak i innymi programistami w tym samym projekcie. Kiedy używasz języka, jesteś ograniczony do pojęć, które mogą być w nim wyrażone, a const jest tylko jeszcze jedną koncepcją, której możesz użyć do opisania swojego problemu i rozwiązania.

Stałość umożliwia wyraźne wyrażenie z tablicy projektowej do kodu jednego pojęcia, które inne języki brak. Ponieważ pochodzisz z języka, który go nie ma, możesz wydawać się zaskoczony pojęciem, którego nigdy nie używałeś-jeśli nigdy wcześniej go nie używałeś, jak ważne może to być?

Język i myśl są ze sobą ściśle powiązane. Możesz wyrażać swoje myśli tylko w języku, którym mówisz, ale język zmienia również sposób myślenia. Fakt, że nie posiadałeś słowa kluczowego const w językach, z którymi pracowałeś, oznacza, że znalazłeś już inne rozwiązania tych samych problemów, a te rozwiązania są tym, co wydaje ci się naturalne.

W pytaniu argumentowałeś, że możesz zapewnić Nie mutujący interfejs, który może być używany przez funkcje, które nie muszą zmieniać zawartości obiektów. Jeśli zastanowisz się nad tym przez chwilę, to samo zdanie mówi ci, dlaczego const jest koncepcją, z którą chcesz pracować. Konieczność zdefiniowania interfejsu bez mutacji i wdrożenia go w klasie to praca wokół faktu, że nie możesz wyrazić tego pojęcia w swojej język.

Stałość pozwala wyrazić te pojęcia w języku, który kompilator (i inni programiści) może zrozumieć. Ustalasz kompromis w sprawie tego, co zrobisz z otrzymanymi parametrami, przechowywanymi referencjami lub definiujesz limity dotyczące tego, co użytkownicy Twojej klasy mogą zrobić z dostarczanymi referencjami. Praktycznie każda nietrywialna klasa może mieć stan reprezentowany przez atrybuty, a w wielu przypadkach istnieją niezmienniki, które muszą być zachowane. Na język pozwala zdefiniować funkcje, które oferują dostęp do niektórych danych wewnętrznych, a jednocześnie ogranicza dostęp do widoku tylko do odczytu, który gwarantuje, że żaden Zewnętrzny kod nie złamie niezmienników.

Tego pojęcia brakuje mi bardziej przy przenoszeniu się na inne języki. Rozważ scenariusz, w którym masz klasę C, która ma między innymi atrybut A Typu A, który musi być widoczny dla zewnętrznego kodu (użytkownicy Twojej klasy muszą być w stanie uzyskać pewne informacje na temat a). Jeżeli Typ A ma jakiekolwiek operacja mutacji, a następnie aby zachować kod użytkownika od zmiany stanu wewnętrznego, należy utworzyć kopię a i zwrócić go. Programista klasy musi być świadomy, że kopia musi zostać wykonana i musi wykonać (być może kosztowną) kopię. Z drugiej strony, jeśli możesz wyrazić stałość w języku, możesz po prostu zwrócić stałe odniesienie do obiektu (w rzeczywistości odniesienie do stałego widoku obiektu) i po prostu zwrócić element wewnętrzny. Pozwoli to kodowi użytkownika na wywołanie dowolnej metody obiektu, która jest zaznaczona jako nie-mutująca, zachowując w ten sposób niezmienniki klasy.

Problemem / zaletą, wszystko zależy od punktu widzenia, stałości jest to, że jest wirusowy. Gdy oferujesz stałe odniesienie do obiektu, tylko te metody oznaczone jako niemutujące mogą być wywołane i musisz powiedzieć kompilatorowi, która z metod ma tę właściwość. Kiedy deklarujesz stałą metody, mówisz kompilatorowi, że kod użytkownika, który ją wywołuje, będzie zachowaj stan obiektu. Kiedy zdefiniujesz (zaimplementujesz) metodę, która ma stałą sygnaturę, kompilator przypomni Ci o Twojej obietnicy i faktycznie zażąda, abyś nie modyfikował wewnętrznie danych.

Język pozwala określić właściwości kompilatora Twoich metod, których nie możesz wyrazić w inny sposób, a jednocześnie kompilator powie Ci, kiedy nie przestrzegasz swojego projektu i spróbuje zmodyfikować dane.

W tym kontekście const_cast nie powinien nigdy być używane, ponieważ wyniki mogą przenieść cię w sferę niezdefiniowanego zachowania (zarówno z punktu widzenia języka: obiekt może znajdować się w pamięci tylko do odczytu, jak i z punktu widzenia programu: możesz łamać niezmienniki w innych klasach). Ale to, oczywiście, już wiesz, jeśli czytasz C++FAQ lite.

Na marginesie, ostatnie słowo kluczowe w Javie nie ma nic wspólnego ze słowem kluczowym const w C++, gdy masz do czynienia z referencjami (w referencjach lub wskaźnikach C++). Finał słowo kluczowe modyfikuje zmienną lokalną, do której się odnosi, niezależnie od tego, czy jest to typ podstawowy, czy Referencja, ale nie jest modyfikatorem obiektu, do którego się odnosi. Oznacza to, że można wywołać metody mutacji poprzez ostateczne odniesienie, a tym samym zapewnić zmiany w stanie obiektu, o którym mowa. W C++ odwołania są zawsze stałe (można je powiązać tylko z obiektem / zmienną podczas budowy), a słowo kluczowe const modyfikuje sposób postępowania kodu użytkownika z odnośnym obiektem. (W przypadku wskaźników można użyć słowo kluczowe const zarówno dla punktu odniesienia, jak i wskaźnika: x const * const deklaruje stały wskaźnik na stałą X )

 8
Author: David Rodríguez - dribeas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-02 22:25:00

Chcesz używać const również w metodach, aby skorzystać z optymalizacji wartości zwrotnej. Zobacz Scott Meyers bardziej efektywny C++ pozycja 20.

 4
Author: count0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-02 21:04:30

Jeśli piszesz programy dla urządzeń wbudowanych z danymi we flashu lub ROM nie możesz żyć bez const-poprawności. Daje to możliwość kontrolowania poprawnego obchodzenia się z danymi w różnych typach pamięci.

 4
Author: chrmue,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-03 07:07:40

W C, Javie i C# można stwierdzić patrząc na stronę wywołania, czy przekazany obiekt może być modyfikowany przez funkcję:

  • w Javie wiesz, że na pewno może być.
  • w C wiesz, że może być tylko wtedy, gdy istnieje'&', lub odpowiednik.
  • w c# musisz też powiedzieć " ref " na stronie wywołania.

W C++ w ogóle nie można tego powiedzieć, ponieważ non-const reference call wygląda identycznie jak pass-by-value. Posiadanie referencji const pozwala na skonfigurowanie i egzekwowanie konwencji C.

Może to zrobić dość dużą różnicę w czytelności dowolnego kodu wywołującego funkcje. Co prawdopodobnie wystarczy, aby uzasadnić funkcję językową.

 2
Author: soru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-02 21:19:05

Anders Hejlsberg (C # architect): ... Jeśli zadeklarujesz metodę, która przyjmuje non-const Bla, nie możesz przekazać jej const Bla. Więc utknąłeś. Więc stopniowo potrzebujesz wersji const wszystkiego, co nie jest const, i skończysz w świecie cienia.

Więc jeszcze raz: jeśli zacząłeś używać "const" dla niektórych metod, Zwykle zmuszałeś do używania tego w większości kodu. Ale czas poświęcony na utrzymanie (wpisywanie, rekompilowanie, gdy brakuje jakiegoś const, itp.) z const-poprawność w kodzie wydaje się większa niż w przypadku naprawiania możliwych (bardzo rzadkich) problemów spowodowanych nieużywaniem const-poprawności w ogóle. Stąd brak wsparcia poprawności w nowoczesnych językach (takich jak Java, C#, Go, itp.) może skutkować nieco skróceniem czasu rozwoju dla tej samej jakości kodu.

Enhancement request ticket do implementacji poprawności const istniał w Java Community Process od 1999 roku, ale został zamknięty w 2005 roku z powodu wyżej wspomnianego "const pollution", a także powody zgodności: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4211070

Chociaż język C# nie ma konstrukcji poprawności const, ale podobna funkcjonalność prawdopodobnie pojawi się wkrótce w "Microsoft Code Contracts" (biblioteka + narzędzia analizy statycznej) dla. NET Framework za pomocą atrybutów [Pure] i [Immutable]: Pure functions in C#

 2
Author: Vlad Rudenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:07

This talk and video from Herb Sutter wyjaśnia nowe konotacje const dotyczące bezpieczeństwa wątków.

Constness może nie było to coś, o co trzeba się wcześniej zbytnio martwić, ale w C++11 jeśli chcesz napisać kod bezpieczny dla wątków musisz zrozumieć znaczenie const i mutable

 2
Author: chillitom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-18 10:33:19

Właściwie to nie... nie do końca.

W innych językach, szczególnie funkcyjnych lub hybrydowych, takich jak Haskell, D, Rust i Scala, masz pojęcie zmienności: zmienne mogą być zmienne lub niezmienne i zazwyczaj są niezmienne domyślnie.

To pozwala ci (i Twojemu kompilatorowi/interpreterowi) lepiej zrozumieć funkcje: jeśli wiesz, że funkcja pobiera tylko niezmienne argumenty, to wiesz, że funkcja nie jest tą, która mutuje Twoją zmienną i wywołując pluskwę.

C i C++ robią coś podobnego przy użyciu const, z tym wyjątkiem, że jest to znacznie mniej stanowcza gwarancja: niezmienność nie jest egzekwowana; funkcja znajdująca się dalej w stosie wywołań może odrzucić konsternację i zmutować Twoje dane, ale byłoby to celowe naruszenie umowy API. Tak więc intencją lub najlepszą praktyką jest, aby działała ona zupełnie jak niezmienność w innych językach.

To wszystko powiedziane, C++ 11 ma teraz prawdziwe mutable keyword, obok bardziej ograniczone słowo kluczowe const.

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-18 23:29:01

Słowo kluczowe const w C++ (stosowane do deklaracji parametrów i typów) jest próbą powstrzymania programistów przed wystrzeliwaniem dużego palca i wyjęciem całej nogi w procesie.

Podstawową ideą jest oznaczanie czegoś jako "nie można modyfikować". Typ const nie może być modyfikowany (domyślnie). Wskaźnik const nie może wskazywać nowej lokalizacji w pamięci. Proste, prawda?

Cóż, tu właśnie pojawia się Constitution. Oto niektóre z możliwych kombinacji można znaleźć siebie w trakcie używania const:

Zmienna const Oznacza, że danych oznaczonych nazwą zmiennej nie można modyfikować.

Wskaźnik do zmiennej const Oznacza to, że wskaźnik może być modyfikowany, ale same dane nie mogą.

Wskaźnik const do zmiennej Oznacza to, że wskaźnik nie może być modyfikowany (aby wskazywać na nowe miejsce pamięci), ale dane, do których wskazuje wskaźnik , mogą być modyfikowane.

Const wskaźnik do zmiennej const Oznacza to, że ani wskaźnik, ani dane, na które wskazuje, nie mogą być modyfikowane.

Widzisz, jak niektóre rzeczy mogą być głupie? Dlatego, gdy używasz const, ważne jest, aby być poprawnym, w którym const etykietujesz.

Chodzi o to, że jest to tylko hack w czasie kompilacji. Etykietowanie po prostu mówi kompilatorowi, jak interpretować instrukcje. Jeśli odrzucisz Consta, możesz robić, co chcesz. Ale nadal będziesz musiał wywoływać metody które mają wymagania const z typami, które są odpowiednio odlewane.

 1
Author: Randolpho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-02 21:10:13

Na przykład masz funkcję:

void const_print(const char* str)
{
    cout << str << endl;
}

Inna metoda

void print(char* str)
{
    cout << str << endl;
}

W głównej:

int main(int argc, char **argv)
{
    const_print("Hello");
    print("Hello");        // syntax error
}

Ponieważ "hello" jest wskaźnikiem znakowym const, łańcuch (w stylu C) jest umieszczany w pamięci tylko do odczytu. Ale ogólnie jest to przydatne, gdy programista wie, że wartość nie będzie changed.So aby uzyskać błąd kompilatora zamiast błędu segmentacji. Jak w zadaniach nie poszukiwanych:

const int a;
int b;
if(a=b) {;} //for mistake

Ponieważ lewym operandem jest const int.

 0
Author: Ramy Al Zuhouri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-16 23:33:44