您的位置:首页 > 编程语言 > C语言/C++

C++ const

2015-11-28 17:43 232 查看
const用法分类

1.1常变量:  const 类型说明符 变量名
1.2 常引用:  const 类型说明符 &引用名
1.3 常对象:  类名 const 对象名(实参)  /   const 类名 对象名(实参)
1.4 常成员函数:  类名::fun(形参) const
1.5 常数组:  类型说明符 const 数组名[大小]
1.6 常指针:  const 类型说明符* 指针名 ,类型说明符* const 指针名
1.7 常函数参数:  void Fun( const A *in); //修饰指针型传入参数
void Fun(const A &in); //修饰引用型传入参数
1.8 常函数返回值 const 类名:fun(形参)


常成员变量

常成员变量与普通常变量申明类似,区别是常成员变量只能在构造方法参数初始化列表初始化。

const int a =10 等价于 int const a = 10: 指定a是一个常变量
const int *a=&b const修饰的是 *a,故这里表示指针指向的内容*a不能变(不能给*a赋值),但是指针a是可以变的(可以给a赋值为别的地址)。
int const *a=&b 与上面的功能相同
int * const a = &b: const修饰的是指针a,也就是这里定义了一个常指针,指针本身的值不可以
改变(不可以给指针赋值为别的地址),但是指向的内容*a可以改变(可以给*a赋值别的数据)。
const int * const a = &b 指向常数据的常指针,既不可以给*a赋值,也不可以给a赋值。
const int &a=100     常数引用,即不能改变引用的值。


const成员函数:用于类数据保护

const成员函数主要用于数据保护,保护类中对象不被修改,可以使用类中所有成员变量,但是不可以修改成员变量的值。常成员函数需要在声明和定义的时候在函数头部的结尾加上 const 关键字

class Test
{
public:
char *name;
char *getName() const;
}

//防止外部修改name的值,故定义为const,只为获取值。
char* Test::getName() const
{
return name;
}


const对象

const对象必须被初始化。

若是new初始化,new返回的指针必须是const类型的

const对象只能访问const成员函数,而非const对象可以访问任意的成员函数;

const对象的成员是不能修改的,而通过指针维护的对象却可以修改的;

class Test
{
public:
string name;
Test(string name);
string getName() const;
void setName(string name);
void setName(string name) const;    //此方法为上一方法的重载
};

string Test::getName() const
{
return name;
}

Test::Test(string name){
this->name = name;
}

void Test::setName(string name){
this->name = name;
}

void setName(string name) const
{
this->name = name;//报错,未定义的=:常成员函数不能修改成员变量。
}

int main()
{
using namespace std;
const Test test("xiaoM");
cout<<test.getName()<<endl;
//test.setName("aaa"); //编译错误:常成员对象无法调用非常成员函数
}


常函数参数:避免函数修改传递过来的对象。

void func(const int a); 做为参数使用,说明函数体内是不能修改该参数的;

对不同参数定义时不同的形式,可参见定义变量时使用方式

同理,将指针参数声明为const,函数将不修改由这个参数所指的对象。

函数参数中const 指针,表示不允许将该指针指向其他内容。

常函数返回值

可以阻止用户修改返回值。返回值也要相应的赋值给一个常量或常指针。

常指针有两种类型:

const 类型说明符* 指针名
等同于
类型说明符 const* 指针名
:
指针名
不能指向别的内存地址,但可以修改其指向的内存地址的内容。

类型说明符* const 指针名
*指针名
的内容不可以改变,但
指针名
可以指向别的字符串

使用

定义const常量
方便编译器进行类型检查
保护被修饰的内容,避免意外修改
节省空间
提高效率


mutable

mutable也是为了突破const的限制而设置的,只能修饰类的非静态数据成员.

使用场景:

需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: