2016-11-17 2 views
-1

Я в основном присваиваю значение const char * строке. Я проверяю условие и устанавливаю, чтобы строка была пустой как значение по умолчанию.Есть ли опасность присвоить const char * строке?

В параметризованном конструктору я устанавливаю строку пустых следующий

ClassName:: ClassName(X x, string name):X(x), name(){}

Я поставил строку пустой раз я сделал, используя его в качестве

name=""; 

ли вышеописанный подход правильной инициализации?

Также существует ли риск присвоить const char * строке?

const char* diag; 
string name; 

name= diag; 
+1

'name =" ";' избыточно. _ «Также существует ли риск присвоить const char * строке?» _ № –

+0

Нет, нет никакого риска. 'string' использует' const char * 'в качестве ссылки. –

+0

Вы должны прочитать о std :: string - в частности, [string :: operator =] (http://www.cplusplus.com/reference/string/string/operator=/). При назначении массива char для строки он копирует его в строку, как на этой странице. Таким образом, это безопасно, если char * имеет нулевое завершение. –

ответ

3

Класса std::string имеет соответствующие конструктор и оператор присваивания для объектов типа char *. Единственная проблема, которая может возникнуть относительно объектов этого типа, - это когда инициализатор является нулевым указателем.

Примите во внимание, что, если объявляется переменная, как этот

const char *name = ""; 

тогда name не является нулевым указателем. Это указатель на первый символ (символ '\0') массива типа const char[1], который соответствует «пустым» строковым литералам и имеет статическую продолжительность хранения.

Если вы пишете, например

std::strig s(name); 

или

std::string s = name; 

, то вы получите пустой объект s типа std::string becsuse нет ничего, чтобы скопировать из «пустого» строкового литерала.

Таким образом, не имеет смысла объявлять объекты типа std::string таким образом. Достаточно написать

std::string s; 
+1

@ πάνταῥεῖ Тем не менее стандарт говорит, что инициализатор не должен быть нулевым указателем. –

+0

@ πάνταῥεῖ: согласно этой ссылке нулевой указатель является неопределенным поведением: http://en.cppreference.com/w/cpp/string/basic_string/basic_string –

+0

@ πάνταῥεῖ И что? –

0

В вашем примере есть не проблема, но в целом вы должны знать, что массив символов, на который указывает const char * является завершающим нулем, в противном случае станд :: строка конструктор будет продолжать чтение памяти за конец массива.

Смежные вопросы