c++ const语法详解

我们在实际开发中都用过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已经没有了意义。


c++ const语法详解


分享到:


相關文章: