string initializing as NULL in C++
20,167
Solution 1
Actually to get an empty std::string
, you just write
std::string a;
std::string
's default constructor will give you an empty string without further prompting.
As an aside, using NULL in C++ is generally discouraged, the recommendation would be to either use 0 (which NULL tends to be defined to anyway) or if you have a modern enough compiler, nullptr
.
Solution 2
There is a difference between null and empty string (an empty string is still a valid string). If you want a "nullable" object (something that can hold at most one object of a certain type), you can use boost::optional
:
boost::optional<std::string> str; // str is *nothing* (i.e. there is no string)
str = "Hello, world!"; // str is "Hello, world!"
str = ""; // str is "" (i.e. empty string)
Author by
user1559792
Updated on December 27, 2020Comments
-
user1559792 over 3 years
string a=NULL;
it gives error. Why and how can I initialize string as NULL?
but when I write
string a="foo";
this it works fine.
-
Zaffy over 11 yearstry to use pointer, you can assign
NULL
to it, but dont forget to use properlynew
anddelete
-
sbi over 11 years@Borgleader: What's wrong with
string a;
? -
Borgleader over 11 years@sbi: Nothing, in fact it's probably better.
-
-
Zaffy over 11 yearsIn C,
NULL
is defined as((void*)0)
but in C++ its just0
. -
Puppy over 11 years
nullptr
will be UB, as it will try to construct astd::string
from a null pointer, which is not allowed by the Standard. -
Fergus In London over 11 yearsNote the typecast
(void*)0
- which means a pointer to 0; not am integer representation of 0. In C++ I think it largely depends on the compiler. -
Puppy over 11 yearsNo, it is just zero. There are plenty of other wrongs in this answer.
-
Mark Ransom over 11 years@DeadMG I think "as an aside" means it doesn't apply to this situation.
-
Matteo Italia over 11 yearsAs an aside, I don't see how using
NULL
is discouraged in pre-nullptr
C++... in practice it's the same as0
(it's guaranteed to be defined as 0), and it makes more clear that we are talking about pointers. -
Admin over 11 years@MatteoItalia
foo(NULL)
will it callfoo(char*)
orfoo(int)
? You'd sayfoo(char*)
becauseNULL
is used for pointers, but it's actually callingfoo(int)
. Clear code is important. Don't ever useNULL
in C++. -
Jakub Zaverka over 11 years@Timo I edited the question, but I still claim that a pointer is an integer (or long). Otherwise you would not be able to perform pointer arithmetics on it.
-
Admin over 11 years
std::string a = NULL;
is an initialization, not an assignment.operator=
isn't called (or at least not directly, depending on the implementation). -
Jakub Zaverka over 11 years@DeadMg please enlighten me.
-
Zaffy over 11 years"abc" is also an "integer" (pointer to ROM address where "abc" is)
-
Admin over 11 years@Zaffy no. It's an array of chars. It decays to a pointer, and how that pointer is stored (if it is stored at all) is implementation-defined. It may be a floating point number on crazy architectures.
-
Matteo Italia over 11 years@Zoidberg'--: no, I'd say
foo(int)
because I know thatNULL
is plain zero. But if I make the mistake and later someone else notices that the wrong overload is called he can immediately understand what I meant and add the relevant cast (otherwise he would have to ask me if I meant "integer zero" or "pointer zero"). I agree thatNULL
is a botch -nullptr
was introduced for a reason, but I feel it's better than using 0 also for pointers. Anyway, all this is both non relevant to the question (I'm sorry for derailing it) and non relevant in general now thatnullptr
solves this problem. -
Timo Geusch over 11 years@JakubZaverka, a pointer is convertible to an numerical value like int or long, but it is a distinct type. That's a big difference.