下記C言語での文字列リテラル、
char *str
str = "abcdefg"
変数宣言時はポインタ変数、(もしくは配列)に格納する必要がある。
下記C++ での文字列リテラル
std::string str;
str="abcdefg";
string というクラスを宣言するだけで、ポインタ宣言が必要なくなる。
string という型ではなく、stringというクラスを宣言していてそのオブジェクトでstrという変数を宣言している事に注意しよう
C言語ではポインタだが、C++ではstring というクラスを宣言するだけで変数に格納することができる。これはstd::string型の内側には、動的にメモリ割り当てを行う char の配列が入っています。
そして、必要なタイミングでメモリ の割り当てを行い、不要になれば解放 を行うという操作が行われる。
そのため、std::string を使うと、文字列の実際の長さを気にする必要がなくなります。
C言語であれば、メモリの管理を自力で行う必要がありますが、これが自動化されるからです。
補足
文字列リテラル "string" は const char[] なので書き換えられる可能性があるとコンパイルエラーになる。
コンパイルエラーを起こさない為に参照元にconst をつけて値を書きかえない事を伝える。
参照)
文字列 | Programming Place Plus C++編【言語解説】 第4章