5
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.

3
  • try to use pointer, you can assign NULL to it, but dont forget to use properly new and delete Commented Dec 16, 2012 at 0:18
  • @Borgleader: What's wrong with string a;? Commented Dec 16, 2012 at 0:23
  • @sbi: Nothing, in fact it's probably better. Commented Dec 16, 2012 at 0:24

3 Answers 3

15

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.

Sign up to request clarification or add additional context in comments.

5 Comments

nullptr will be UB, as it will try to construct a std::string from a null pointer, which is not allowed by the Standard.
@DeadMG I think "as an aside" means it doesn't apply to this situation.
As an aside, I don't see how using NULL is discouraged in pre-nullptr C++... in practice it's the same as 0 (it's guaranteed to be defined as 0), and it makes more clear that we are talking about pointers.
@MatteoItalia foo(NULL) will it call foo(char*) or foo(int)? You'd say foo(char*) because NULL is used for pointers, but it's actually calling foo(int). Clear code is important. Don't ever use NULL in C++.
@Zoidberg'--: no, I'd say foo(int) because I know that NULL 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 that NULL 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 that nullptr solves this problem.
4

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)

Comments

-2

Let's break down what you are in fact doing:

string a=NULL;

First you execute string a. This creates a new object on the stack, with default value (an empty string). Then you execute a=NULL, which calls the assignment function of the string class. But what is NULL? NULL in C++ is macro expanded into just 0. So you are attepting to assign an integer to a string variable, which of course is not possible.

string a="abc"

works, because you want to assign a char array, and the string class has the assignment operator method overloaded for char arrays, but not for integers. That's why NULL doesn't work and "abc" works.

9 Comments

In C, NULL is defined as ((void*)0) but in C++ its just 0.
Note 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.
std::string a = NULL; is an initialization, not an assignment. operator= isn't called (or at least not directly, depending on the implementation).
@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.
@JakubZaverka, a pointer is convertible to an numerical value like int or long, but it is a distinct type. That's a big difference.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.