C++ 中const使用总结

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; 

在函数后面加一个const声明,表示在该函数体内不能修改类内部的属性成员的值。如果不小心修改了,编译会报错。

你可能感兴趣的:(C++,Const)