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.