const char*和char const*和const char * const
String.h檔案 #include <iostream> #include <string> using namespace std; class String { public: String() { s = NULL; } String(const char *str); friend bool operator>(String &string1, String &string2); void display(); private: const char *s; }; String.cpp檔案 #include "pch.h" #include <iostream> #include "String.h" using namespace std; String::String(const char *str) { s = str; } void String::display() { cout << s; } bool operator>(String &string1, String &string2) { if (strcmp(string1.s, string2.s) > 0) return true; else return false; } 主函式 #include <stdio.h> #include <iostream> #include "String.h" #include <cstring> using namespace std; int main() { String string1="aello"; String string2("bookd"); cout <<(string1>string2) << endl; system("pause"); return 0; }
這是一個簡單的過載string函式以用於比較兩個字串的字典序的程式,程式本身很簡單,問題出在一開始的私有成員宣告的時候用的是char *s;就會產生如下錯誤:
系統會自動把“aello”定義為const char[6];把私有資料成員改成了const char *s;之後就可以成功執行。
string類的建構函式:
*NBTS:以空字元結束的字串---傳統的c字串。
所以string本身的帶參建構函式就是有string(const char *s),本身就帶著const,而const字元是不能賦值給非const的,所以在main函式裡呼叫建構函式時也要帶const.
string的拷貝建構函式
拷貝建構函式,是一種特殊的建構函式,它由編譯器呼叫來完成一些基於同一類的其他物件的構建及初始化。其唯一的引數(物件的引用)是不可變的(const型別)。此函式經常用在函式呼叫時使用者定義型別的值傳遞及返回。拷貝建構函式要呼叫基類的拷貝建構函式和成員函式。如果可以的話,它將用常量方式呼叫,另外,也可以用非常量方式呼叫。
String::String(const String &other)
{
int length = strlen(other.m_data);
m_data = newchar[length+1];
strcpy(m_data,other.m_data);
}
引用 Thingking in C++的作者Bruce Eckel的回覆:限定詞const是很嚴格的,沒有強調const的地方時字元陣列的字面值。也許有人可以寫:char* cp="howdy";編譯器將接受它而不報告錯誤。從技術上講這是一個錯誤,因為字元陣列的字面值(這裡是"howdy")是被編譯器作為一個常量字元陣列建立的,所引用該字元陣列得到的結果是它在記憶體裡得首地址。修改該字元數組裡的任何字元都會導致執行時錯誤,當然,並不是所有編譯器都會做到這一點。所以字元陣列的字面值實際上是常量字元陣列,當然編譯器把它們作為非常量看待,這是因為有許多現有的C程式碼是這樣做的。當然,改變字元陣列的字面值的做法還未被定義,雖然可能在很多機器上時這樣做的。如果想修改字串,就要將它放到一個數組中:char cp[]="howdy"。
- 對於const char *s來說,const char*是指向常量的指標,而不是指標本身為常量,可以不被初始化.該指標可以指向常量也可以指向變數,只是從該指標的角度而言,它所指向的是常量。*s是不變的,s是可以改變的,const限定的*s。s被一個解引用運算子修飾,故s是個普通的指標,可以修改,但是s所指向的資料(即*s)由於const的修飾而不可通過指標s去修改。
- char *const s宣告(*const s),(*const s)是char型別的。s被一個解引用運算子和一個const關鍵詞修飾,故s是個不可修改的指標,但可通過指標s去修改s所指向的資料(即*s)。
- char const *s和const char *s是同一個意思。
- 如果既不允許s被修改,也不允許s所指向的資料被修改,那麼需要宣告為const char * const s。
現在的排名是117萬。
小樊看完請評論驗收,耶。
部落格寫錯還改一次,但是華晨宇給我勇氣和力量!
華晨宇的新歌《鬥牛》巨無敵好聽!!!
野性坦露著靈魂純粹 或者肆意妄為...
mer...