我们在实际开发中都用过const,但大部分开发者可能了解的还不够透彻下面我们就来简单聊聊。
c++允许你指定一个语义约束,也就是指定一个不该被改动的对象,而编译器会强制实施这项约束。如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助。
const修饰谁?即怎么确定const约束的是谁?下面我们上代码,帮助大家一目了然的看下。
(一)const修饰指针,简单总结下如下:
(1)只有一个const,如果const位于*左侧,表示指针所指数据是常量,不能通过解引用修改该数据
指针本身是变量,可以指向其他的内存单元。
(2)只有一个const,如果const位于*右侧,表示指针本身是常量,不能指向其他内存地址,指针所指的
数据是可以通过解引用修改的。
(3)两个const,*左侧右侧各一个时,表示指针和指针所指向的数据都是不能修改的。
<code>#include <iostream>
using namespace std;
int main()
{
\tint num1 = 3; //non-const data
\tconst int num2 = num1; //const data
\tint* p1 = &num1; //non-const data non-const pointer
\tconst int* p2 = &num1; //const data non-const pointer
\tint* const p3 = &num1; //non-const data const pointer
\tconst int* const p4 = &num1;//const data const pointer
\treturn 0;
}/<iostream>/<code>
(二)const修饰函数参数
传递过来的参数在函数内是不可以被改表的,如果修改编译器会编译不过。
<code>void f(const int x)
{
\tx = 1; //这里是编译不过的
}/<code>
(三)const修饰成员函数
(1)const修饰的成员函数不能够修改任何的成员变量,mutable修饰的变量是可以修改的
这是个特例。
(2)const修饰的成员函数不能调用非const成员函数,因为非const成员函数可能修改成员变量。
<code>#include <iostream>
using namespace std;
class T
{
public:
\tT(int _t) :t(_t) {}
\tvoid test2(int t1)
\t{
\t\tt = t1;
\t}
\tvoid test1(int _x) const
\t{
\t\tt = _x; //这里会编译不过
\t\ttest2(_x); //这里也会编译不过
\t}
private:
\tint t;
};/<iostream>/<code>
(四)const修饰函数返回值
(1)指针传递,如果返回 const data, 则接受返回值的变量也必须是const的,因为指针指向的数据是常量不能修改。
<code>const int* f()
{
\tint* a = new int(1);
\treturn a;
}
int main()
{
\tint* p = f(); //这里编译器会报错
\tconst int* p1 = f();//这是正确的做法
\treturn 0;
}/<code>
(2)值传递,如果函数返回值是值传递,因为返回值是一份拷贝,加const已经没有了意义。
閱讀更多 coder人生 的文章