先看一段代碼和它的運行結果:
看到結果了么這個運行的結果和我們理解的是不會有差距.對於經驗豐富的開發者可能會微微一笑,但是對於一個剛剛學習的人就開始疑惑了.這里主要說兩個問題:
1、聲明了一個string實例,使用c_str()進行賦值后,可以正常輸出c_str()的值,但是直接輸出string實例的實現,實際是空字符串
2、在第一個問題后,對string實例進行字符串追加,然后對string和c_str()進行輸出.原來對字符串變量被覆蓋了.
下面來具體分析下吧:
c_str()接口是string類的一個函數,返回的是字符串的首地址,返回值類型是const char *的.如果要使用它並對其進行賦值操作,必須要使用strcpy函數.如果哦直接進行賦值,是不會賦值成功的.(小
知識:const char *是指向常量字符串的指針.)
在string類中.c_str()的生命周期受到string類實例的影響.如果我們使用string對象實例進行賦值,字符串被復制到一個char*的成員變量,然后在調用c_str()的時候,會直接返回string類中維護的
char*成員的首地址.這樣也就能保證了使用string和c_str()都能輸出想要的字符值.
但是,在ddemo中,先使用strcpy對const char *進行強轉,然后進行賦值.雖然可以正常打印,但是對string對象中維護的成員沒有正確的維護.所以,當進程再次使用string對象進行賦值時.新對字符
串會覆蓋老的字符串.使用c_str()打印的時候也是新的char*成員指向的地址.這樣也就解釋了在使用append對實例賦值時,后面打印的結果是追加字符串的值.
其實,前面說的都是廢話,用一句話就可以說明,就是:在使用string中的c_str()進行字符串賦值時,如果后面對string中的char*進行改變.那么c_str()中的值就不在可靠了.