date: 2017-03-28 20:03:30
重定义默认参数
- 代码举例
class Students {
public:
Student(int n = 0, char *s = "no name");
};
Student::Student(int n = 0, char *s = "no name") {
....
}
语法规定:
参数的默认值只可以出现在函数声明中,不可以出现在函数的定义中,否则会出现参数重复定义默认参数的错误:
1.定义和声明分开:默认值只可以出现在声明中
2.定义和声明不分开,默认值只能出现在定义中
类中的const
- const函数不能修改类成员的数据,同样的,const函数也只能调用其他的const函数(防止修改成员),否则会报错。
- const成员或引用类型只能初始化,不能对他们赋值,所以要使用“类构造函数列表” 例:
class sb{
private:
const int i;
public:
sb(int ii);
};
sb::sb(int ii):i(ii){}
如果改成
sb::sb(int ii){
i=ii;
}
则会报错
拷贝构造函数与赋值函数
- 例
class String
{
public:
String(const char *str);
String(const String &other);//拷贝构造函数
String & operator=(const String &other);//赋值函数,=运算符重载
~String(void);
private:
char *m_data;
};
- 定义
String::String(const String &other)
{
cout << "自定义拷贝构造函数" << 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 << "自定义赋值函数" << 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
- 拷贝构造函数只有在对象创建时可用,赋值函数只可用于已存在的对象
- 赋值函数先要预防自赋值,是危险操作,因为下面的delete []m_data会将自己释放成野指针
- delete的必要性:引用对象占空间可能与当前不一样,需要重新“按需分配空间”
网友评论