date: 2017-03-28 20:03:30
重定義默認(rèn)參數(shù)
- 代碼舉例
class Students {
public:
Student(int n = 0, char *s = "no name");
};
Student::Student(int n = 0, char *s = "no name") {
....
}
語法規(guī)定:
參數(shù)的默認(rèn)值只可以出現(xiàn)在函數(shù)聲明中捆蜀,不可以出現(xiàn)在函數(shù)的定義中徘禁,否則會(huì)出現(xiàn)參數(shù)重復(fù)定義默認(rèn)參數(shù)的錯(cuò)誤:
1.定義和聲明分開:默認(rèn)值只可以出現(xiàn)在聲明中
2.定義和聲明不分開蹋砚,默認(rèn)值只能出現(xiàn)在定義中
類中的const
- const函數(shù)不能修改類成員的數(shù)據(jù),同樣的潘飘,const函數(shù)也只能調(diào)用其他的const函數(shù)(防止修改成員)拇涤,否則會(huì)報(bào)錯(cuò)。
- const成員或引用類型只能初始化测柠,不能對(duì)他們賦值炼鞠,所以要使用“類構(gòu)造函數(shù)列表” 例:
class sb{
private:
const int i;
public:
sb(int ii);
};
sb::sb(int ii):i(ii){}
如果改成
sb::sb(int ii){
i=ii;
}
則會(huì)報(bào)錯(cuò)
拷貝構(gòu)造函數(shù)與賦值函數(shù)
- 例
class String
{
public:
String(const char *str);
String(const String &other);//拷貝構(gòu)造函數(shù)
String & operator=(const String &other);//賦值函數(shù),=運(yùn)算符重載
~String(void);
private:
char *m_data;
};
- 定義
String::String(const String &other)
{
cout << "自定義拷貝構(gòu)造函數(shù)" << endl;
int length = strlen(other.m_data);
m_data = new char[length + 1];
strcpy(m_data, other.m_data);
}
String & String::operator=(const String &other)
{
cout << "自定義賦值函數(shù)" << endl;
if (this == &other)
{
return *this;
}
else
{
delete [] m_data;
int length = strlen(other.m_data);
m_data = new char[length + 1];
strcpy(m_data, other.m_data);
return *this;
}
}
-
Attention
- 拷貝構(gòu)造函數(shù)只有在對(duì)象創(chuàng)建時(shí)可用轰胁,賦值函數(shù)只可用于已存在的對(duì)象
- 賦值函數(shù)先要預(yù)防自賦值谒主,是危險(xiǎn)操作,因?yàn)橄旅娴膁elete []m_data會(huì)將自己釋放成野指針
- delete的必要性:引用對(duì)象占空間可能與當(dāng)前不一樣软吐,需要重新“按需分配空間”