1.用于修饰变量,表示该变量初始化后不可改变
测试代码:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
const int value = 10;
value = 30; //value值不可修改
return 0;
}
程序编译时会报错,error C3892: 'value' : you cannot assign to a variable that is const
不能修改一个const类型的变量。
2.对指针进行修饰
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int value1 = 10;
int value2 = 20;
//此处const用于修饰指针p,表示指针p本身的值是不可变的,不能指向其他地址
int * const p = &value1;
p = &value2; //此处会报错
cout<<*p<<endl;
getchar();
return 0;
}
因为p被const修饰过,所以p的值是不可以改变的。当对p重新赋值时,就会报错。但是p指向的那个对象可以改变。
在上述代码中,可以修改value1的值。
Const int *p中,const修饰的是指针p指向的那个对象,即表示指针p可以指向其他内存空间,但是不可以通过p去修改p指向的那个对象的值。
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int value1 = 10;
int value2 = 20;
//此处const用于修饰指针p,表示指针p本身的值是不可变的
const int *p = &value1;
p = &value2;
cout<<*p<<endl;
getchar();
return 0;
}
此处输出的内容是20,表示p指向了value2.
如果对代码做如下修改
const int *p = &value1;
*p = 30;
但是此处并不表示value1是不可改变的,我们可以直接对value1进行赋值,比如value1 = 30;只是说不能通过指针p去修改p指向的内容。此处程序编译会报错,因为p指向的对象是一个常量,不能通过p去修改p指向的对象。一旦修改,就会报错。
3. const在函数中的修饰作用
指针类型参数:void Dataopy(char *dest, const char *src);
其中src是输入参数,dest是输出参数。给src加const修饰,那么不能通过sr指针修改指向的那块内存空间,保护数据,防止被修改。
基本类型的值传递参数:
如果参数是值传递,则参数只是一个副本,并没有对原有的数据进行改动,所以不需要用const就行修饰。
自定义对象的引用传递参数:
若参数是我们自定义的对象,采用值传递效率较低,我们为了提高效率,常常是采用引用的方法,但是我们不希望通过引用修改对象的内容,也可以在引用前加以const修饰。如:
Session& operator=(const Session &session);
基本类型也可以这么用,OK的。
对函数返回值的描述
const char* getContent()
{
char* p = new char[20];
char szContent[] = "This is my Test";
memset(p, 0, 20);
memcpy(p, szContent, 15);
return p;
}
int main()
{
char* p = getContent();
cout<<p<<endl;
return 0;
}
这段代码编译会有错误:
G:\sourceCode\constTest\constTest\main.cpp|16|error: invalid conversion from 'const char*' to 'char*'|
应该这么写哈:const char* p = getContent();意义跟上面的有重复,但是使用的场合不太一样。
const成员函数:
Socket getSock()const;