以下所有声明都相同吗?如果是这样,声明常量函数的标准方法是什么?
const SparseMatrix transpose();
SparseMatrix transpose() const;
const SparseMatrix transpose() const;
以下所有声明都相同吗?如果是这样,声明常量函数的标准方法是什么?
const SparseMatrix transpose();
SparseMatrix transpose() const;
const SparseMatrix transpose() const;
函数名左边的 const 表示返回的对象不能修改。右侧的 const 表示该方法是类的一部分,并且不修改其任何数据成员。除非或当然它的任何数据成员是用关键字声明的,在这种情况下,尽管有保护,mutable
但仍允许对其进行修改。const
const
当函数的返回类型是非指针类型时,关键字的位置并不重要:
T const f(); // same as const T f();
但是,请注意,const
在使用指针作为返回类型时,关键字的位置很重要。例如:
const T* f();
此方法返回一个指向 const 的指针T
。也就是说,它指向的东西是不可变的。因此,您不能通过取消引用返回的指针来进行赋值:
T* x = f();
*x = y; // error: assignment of read-only location '*(const T*)x'
当 const 放在返回类型(即指针)的右侧时,表示指针是 const 且不能更改。
T* const f();
int main()
{
T* x const;
x = f(); // error: assignment of read-only variable 'x'
}
此外,如果我们const
在指针的两侧都有返回类型,并且const
表示“不修改类成员”,那么它读作如下:
const T* const f() const;
一个名为的 const 成员函数
f
,它返回一个指向 const 的 const 指针T
第一个将返回一个SparseMatrix
const 且不能更改的值。
第二个声明了一个返回 a 的函数,SparseMatrix
并确保该函数不会更改任何类变量(假设它是一个成员函数,否则对于这种减速没有意义),除了可变成员。
最后一个两者兼而有之。
1) 返回一个 const 值 2) const 函数,内部没有成员变化 3) 1)+2)