2015-03-09 36 views
40

Wszystkie nazwy w standardowej bibliotece C++ są małe, z wyjątkiem std::ios_base::Init. Dlaczego to?Dlaczego "Init" w std :: ios_base :: Init uppercase?

+0

Powiedziałbym, że to po prostu dlatego, że wykonuje wiele ważnych prac związanych z inicjowaniem, konserwacją i czyszczeniem strumieni IO. Jest wyjątkowy pod tym względem, więc dostał kapitał. – IVlad

+1

Kompatybilność wstecz. –

+1

Ponieważ konwencje nazewnictwa i nazwy w C++ są kompletną plątaniną, tak jak były w C. – EJP

Odpowiedz

22

We wczesnym draft klas IOStream Widać, że ios_base nie był pierwotnie obecny, basic_ios była klasa bazowa i był odpowiedzialny za Init i innych elementów, które później zostały rozdzielone na ios_base.

basic_ios też miał (a still has) funkcja init, a gdy obie nazwy nie koniecznie muszą być wyraźne, przypuszczalnie, aby spróbować uniknąć nieporozumień zdecydowano się wymienić klasę Init i funkcję init. Również bez Rozróżnienie to coś jak następuje byłoby konieczne przy użyciu klasy:

struct ios_base 
{ 
    struct init{}; 
    void init(); 
}; 

ios_base::init i1;  // error 
struct ios_base::init i2; // ok 

Pomysł posiadające oddzielną klasę odpowiedzialną za inicjowanie standardowe strumienie sięga przynajmniej CFront 3,0, jak widać przez Iostream_init w nagłówku this. W pewnym momencie postanowiono nie tylko sprawić, że klasa będzie należała do domeny ios/basic_ios/ios_base, ale powinna również zmienić nazwę na Init.

W każdym przypadku sensowne jest ujednoznacznienie obu, nawet biorąc pod uwagę fakt, że ostatecznie zostały umieszczone w oddzielnych klasach. Mogli zamiast tego wybrać zupełnie oddzielne nazwy, ale prawdopodobnie uznano, że jest to najlepszy semantyczny wybór do opisania klasy i funkcji. Istnieje również szansa, że ​​po prostu naśladował starszego Iostream_init, który z jakiegoś powodu również zaczyna się od wielka litera I.

+1

"ma" jest zbyt silne, ale tak, funkcja składowa o tej samej nazwie, co klasa klasy podstawowej, spowoduje, że ta klasa członków zostanie ukryta. – hvd

+2

Hmm ... Sprawdzanie implementacji standardowego libstdC++, w ewolucji, która doprowadziła do standardu C++ 98, był punkt, w którym istniała tylko klasa 'ios' zawierająca zarówno' Init' i 'init'. W tym momencie różne nazwy były absolutnie niezbędne, a nie tylko przyjemne. – hvd

+1

@hvd Zmieniłem sformułowanie odpowiedzi dzięki waszemu komentarzowi, różnica init/init wydaje się być artefaktem z odległej przeszłości. Chciałbym jednak podkreślić, że funkcja i klasa o tej samej nazwie nadal mogą szczęśliwie współistnieć w tym samym zakresie. – user657267