2016-02-09 12 views
1

Я новичок в C++, и я хотел бы знать с самого начала,Различные способы сделать строку?

Выполняет ли какой-либо из этих способов создание строк точно так же и дает одинаковые результаты всегда в каждом случае? есть ли какая-либо разница в результате в любом из них?

1) char greeting [6] = { 'h','e','l','l','o','\0' }; 

2) char greeting[] = "hello"; 

3) #include <string> 
    string greeting = "hello"; 
+0

Ответил ли этот вопрос на ваш вопрос? http://stackoverflow.com/a/1287357/248756 –

+2

Обратите внимание, что первые два предназначены для строк C-стиля - только # 3 создает строку C++. См. Также [этот вопрос] (http://stackoverflow.com/questions/801209/char-vs-stdstring-in-c). –

+0

Первые два идентичны. У вас пока нет возможности: 'char * greeting =" hello ";' и аналогичный 'const char * greeting =" hello ";' –

ответ

5

1) и 2) работают точно так же. Оба создают 6-элементный массив, не содержащий кучу, и копируют в массив во время выполнения или время загрузки символы 'h', , 'l', 'l', 'o', '\0'.

3) создает экземпляр std::string и вызывает его конструктор, который копирует символы 'h', 'e', 'l', 'l', 'o' (, '\0') * его внутренний буфер памяти. (* The '\0' не требуется хранить в буфере памяти.)

Существует еще один способ объявить строку в C++, используя указатель на char:

const char* greeting = "hello"; 

Это не будет ничего копировать. Он просто укажет указатель на первый символ 'h' строки "hello" с нулевым завершением, который находится где-то в памяти. Строка также доступна только для чтения (ее изменение вызывает неопределенное поведение), поэтому здесь следует использовать указатель-на-const.

Если вам интересно, какой из них использовать, выберите std::string, это самый безопасный и простой.

+1

1 и 2 создайте объекты в стеке ** только если ** они являются локальными переменными. Если они являются глобальными, они идут в статическом хранилище и могут быть инициализированы во время загрузки, т. Е. Без каких-либо служебных затрат времени исполнения. –

+0

Вместо использования * stack * Я бы предложил * объекты с автоматической продолжительностью хранения. * – NathanOliver

1

Эти методы изготовления струн работают точно так же и дают одинаковые результаты всегда в каждом случае?

Первых два array определение:

char greeting [6] = { 'h','e','l','l','o','\0' }; 
char greeting [ ] = "hello"; 

"работает тот же" как во втором определению '\0' добавляется неявно.

Что касается третьего определения:

string greeting = "hello"; 

string is a class type object и как таковое оно является более сложным, чем простой массив.

Есть ли какая-либо разница в результате в любом из них?

Существует количественная и качественное отличие между двумя первыми и третьим, вытекающим из того факта, что std::string является объектом типа класса.


1. Количественные: массивы занимают меньше места в памяти, чем строки.

2. Качественный: строка обеспечивает управление ресурсами и множество возможностей для манипулирования элементами.