Function Design in Cpp
想到哪写到哪, 杂乱
const 修饰成员函数
一个常见的情形如下:
1
2
3
// 声明一个 const 类, 并输出其数据
const T m1;
cout << m1.data();
一个容易令人忽视的地方在于, 成员函数 member.data 的设计会漏写 const, 从而导致类型无法转换的报错( 指针引用转为 const 指针 )
1
2
// 隐式参数 const member *this (成员函数自带)
T data() const { return this->data; }
const放在后面表示所有参数都被其修饰
重载 << 操作符的注意事项
- 一定是非成员函数
原因: 使用场景常见为 cout << ..., 与其他操作符不同, << 作用在其左侧的对象中. 因此如果在成员对象中重载, 那么就需要如此调用(通过成员对象调用) m1 << cout; 极度诡异.
- 输入流不能被
const修饰
原因: 所有操作交给 cout 时, 都对其进行了修改. 因此对该操作符进行重载时, 一定有如下声明
1
ostream& operator<< (ostream& os, ...)
- 返回值一定是
cout对应类型的指针
原因: 使用场景 cout << ... << ..., 如果返回值为 void, 从右向左执行时, 会出现调用 ostream& operator<< (void, ...) 的情况, 显然与预期不符, 形参类型不匹配报错.
考虑到有许多情况下我们都会这样连续赋值, 因此针对
=或+=之类类似的赋值操作符重载时, 都需要考虑返回值, 避免这样连续调用产生的错误
含指针成员的拷贝赋值函数
- 针对
=进行重载时, 如果类中含有指针成员, 那么一定要做自我赋值检测
原因: 两个相同的指针指向同一地址, 如果先删除后重新赋值会非法访问指针(原指针已被删除)
1
2
3
4
5
6
7
8
9
10
11
T &T::operator=(const T &addr)
{
//
if (this != &addr)
{
delete[] data;
data = new char[len(addr.data) + 1];
copy(data, addr.data);
}
return *this;
}
This post is licensed under CC BY 4.0 by the author.