何时在C++函数定义前添加const?类中三类函数的const疑问
首先得明确:函数定义前的const是用来修饰返回值的,它的作用是让函数返回的对象/值变成const类型,限制后续对这个返回值的修改操作(比如不能调用非const成员函数、不能给它赋值)。下面逐个分析你代码里的三个函数:
1. 拷贝构造函数的const(代码里的const coor(const coor& P))
这其实是错误的写法——拷贝构造函数是特殊的构造函数,它没有返回值,也不能在前面加任何返回类型修饰(包括const)。你写的这个函数根本不是拷贝构造函数,编译器会把它当成一个普通的成员函数看待。真正的拷贝构造函数应该写成:
coor(const coor& P) { x = P.X(); y = P.Y(); }
所以这里的const完全多余,甚至违反了构造函数的语法规范,建议直接去掉。
2. operator+的const(const coor operator+ (const coor& P))
这里的const不是语法上必须的,但属于代码规范层面的推荐用法。
如果不加const,会允许这种无意义的代码:
(p1 + p2) = p3; // p1+p2返回临时对象,赋值给临时对象没有实际意义
加了const后,临时对象变成const类型,上面这种写法会直接编译报错,避免这类错误操作。所以从代码健壮性来说,建议保留这个const,但如果你的代码里不会出现这种场景,不加也能正常运行。
3. addone函数的const(const coor addone())
这个const不是必要的,甚至不符合常规用法。
你的addone函数会修改当前对象的x和y,然后返回*this。如果加了const,返回的是const对象,意味着你不能对返回结果继续调用非const成员函数,比如:
p.addone().addone(); // 编译报错,因为第一个addone返回const对象,不能调用非const的addone
而如果去掉const,就支持这种链式调用。从设计意图来说,这类修改自身的函数通常返回non-const对象,允许后续操作,所以这里的const建议去掉。
总结一下,返回值前加const的核心场景是:你希望限制返回的对象被修改,避免无意义的操作,比如运算符+、-这类返回临时对象的函数,加const能防止对临时对象的赋值等错误操作。
内容的提问来源于stack exchange,提问作者taitai

