欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

const的一些注意事项

发布时间:2025/3/21 30 豆豆
生活随笔 收集整理的这篇文章主要介绍了 const的一些注意事项 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

今天在继续学习STL的过程中遇到了一些编译错误。看一下下面的代码——

class stone{private:int weight;public:stone(int i){weight=i;}bool operator<(const stone& st){return weight<st.weight;} };template<class T> inline bool min(const T& a,const T& b){return a<b?true:false; }int main(){stone a(1);stone b(2);cout<<::min(a,b); }

代码很简单,是关于函数模板与重载的一个test,但是却报了这样的一个编译错误[Error] passing ‘const stone’ as ‘this’ argument of ‘bool stone::operator<(const stone&)’ discards qualifiers [-fpermissive]

原因是我在写模板时往往有这样的一个编程习惯 inline bool min(const T& a,const T& b),如果T不是类的话没有问题,但如果T是一个类的话,const修饰的对象只能访问const函数,而我上面的重载函数却恰恰没有在参数列表后加上一个const,导致了这个错误。

所以干脆来总结一下const的注意事项吧——

  • 阻止一个变量被改变,可以使用 const 关键字。在定义该 const 变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
  • 对指针来说,可以指定指针本身为 const,也可以指定指针所指的数据为 const,或二者同时指定为 const;
  • 在一个函数声明中,const 可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
  • 对于类的成员函数,若指定其为 const 类型,则表明其是一个常函数,不能修改类的成员变量,类的常对象只能访问类的常成员函数;
  • 对于类的成员函数,有时候必须指定其返回值为 const 类型,以使得其返回值不为“左值”。
  • const 成员函数可以访问非 const 对象的非 const 数据成员、const 数据成员,也可以访问 const 对象内的所有数据成员;
  • 非 const 成员函数可以访问非 const 对象的非 const 数据成员、const 数据成员,但不可以访问 const 对象的任意数据成员;
  • 一个没有明确声明为 const 的成员函数被看作是将要修改对象中数据成员的函数,而且编译器不允许它为一个 const 对象所调用。因此 const 对象只能调用 const 成员函数。
  • const 类型变量可以通过类型转换符 const_cast 将 const 类型转换为非 const 类
    型;
  • const类型变量必须定义的时候进行初始化,因此也导致如果类的成员变量有const类型的变量,那么该变量必须在类的初始化列表中进行初始化;
  • 对于函数值传递的情况,因为参数传递是通过复制实参创建一个临时变量传递进函数的,函数内只能改变临时变量,但无法改变实参。则这个时候无论加不加 const对实参不会产生任何影响。但是在引用或指针传递函数调用中,因为传进去的是一个引用或指针,这样函数内部可以改变引用或指针所指向的变量,这时 const 才是实实在在地保护了实参所指向的变量。因为在编译阶段编译器对调用函数的选择是根据实参进行的,所以,只有引用传递和指针传递可以用是否加 const 来重载。一个拥有顶层 const 的形参无法和另一个没有顶层 const 的形参区分开来。
  • 总结

    以上是生活随笔为你收集整理的const的一些注意事项的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。