2013-07-19 12 views
16

Jeśli ciąg jest zdefiniowany jak tenWartość i wielkość niezainicjowanej zmiennej std :: string w C++

std::string name; 

Jaka będzie wartość napisu niezainicjowane „nazwa” i jaki rozmiar by to było?

+12

Nie jest niezainicjowany. – chris

+1

Jak zauważyli inni, domyślny konstruktor został wywołany, ale aby odpowiedzieć na konkretne pytanie, możesz wypróbować 'cout << name' i' cout << name.length() '. – Simon

+12

@Simon próbuje coś nie powiedzieć, jeśli niezdefiniowane zachowanie lub jego definicja została zdefiniowana (ale byłby to dobry początek :-)). –

Odpowiedz

28

Ponieważ nie jest zainicjowany, jest to domyślny konstruktor, który jest wywoływany. Następnie:

pusty konstruktor string (domyślny konstruktor):

Tworzy pusty łańcuch o długości zero znaków.

Spójrz: http://www.cplusplus.com/reference/string/string/string/

Edycja: Zgodnie C++ 11 §21.4.2/1:

E ECTS ff: konstruuje obiektu klasy basic_string. W postconditions tej funkcji są podane w tabeli 63.

-> Table 63 
+-----------------------------------------------------------------------------+ 
| data()  | a non-null pointer that is copyable and can have 0 added to it | 
+------------+----------------------------------------------------------------+ 
| size()  | 0                | 
+------------+----------------------------------------------------------------+ 
| capacity() | an unspecified value           | 
+-----------------------------------------------------------------------------+ 
11

Domyślnie skonstruowane typy zdefiniowane przez użytkownika nie są niezainicjowane. Domyślny konstruktor definiuje pusty ciąg (tj. "") o rozmiarze/długości równym zero.

4

normy (C++ 11 §21.4.2/1), opisuje wyniki domyślnych Budowa (którego std::basic_stringstd::string jest specjalizacja) w następujący sposób:

[...] obiekt klasy basic_string. Warunki końcowe [...] wskazano w tabeli 63.

i Tabela 63 mówi:

data() niepusta wskaźnik, który jest copyable i może mieć 0 dodane do niego
capacity() gdy wartość nieokreślona

+0

Jakie jest znaczenie części "można dodać do niej"? Wydaje się nie na miejscu. Nie możesz dodać 0 do jakiegokolwiek wskaźnika innego niż zerowy? – vargonian

-4

wartości ma wartość null, a rozmiar to 0 Ale możesz bezpośrednio chk, jeśli ciąg znaków jest pusty lub pusty()

Tylko w przypadku, gdy chcesz sprawdzić, czy w aplikacji, Zrób to

std::string name // Construct an empty string 
if(name.empty()) { // Check if its empty 
    name="something"; 
} 

podobne i bardziej szczegółowa dyskusja jest tutaj initializing strings as null vs. empty string

+1

To nie tylko sprawdza, czy ciąg znaków jest pusty. Przypisuje mu wartość. Ponadto, w jaki sposób to odpowiada na pytanie? – jogojapan

Powiązane problemy