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