此文章作为学习笔记,记录在学习过程中遇到的一些知识点,如果有任何错误,欢迎指出~
const的全称为constant,译为常量。
我们通常把使用类修饰符const的类型称为常类型,常类型的变量或对象的值是不能被更新的。
const可以对常量进行定义,被const定义的变量禁止修改,起保护作用,增加了程序的健壮性。
const类型变量必须进行初始化,因为其被定义后不能被修改,所以必须进行初始化。
const int temp = 100;
temp = 101; // error: const不允许修改
const int i,j=0; // erroe:const类型必须进行初始化
const string s = "hello world"; // right
与指针相关的const类型有四种:
const char *a; // 常量指针 指向const对象的指针
char const *a; // 同上
char * const a; // 指针常量 指向类对象的const指针
const char * const a; // 指向const对象的const指针
注:const + * 为常量指针,即指向const对象的指针,const修饰指针所指对象;* + const 为指针常量,const修饰的是指针本身。
const与指针的应用:
1)常量指针
常量指针,重点落在指针上,const是对指针的修饰。对于常量指针,不能修改对象的值,不能通过void * 指针保存const对象的地址,必须使用const void * 类型指针保存const对象的地址。
const int *ptr;
*ptr = 10; // error
const int p = 10;
const int * ptr_p = &p; // right
// const void * ptr_p = &p; // right
// int *ptr_p = &p; // right
// void *ptr_p = &p; // error
ptr是一个指向int类型的const对象指针,ptr可以不用赋初始值,但不能通过ptr去修改所指对象的值,可以通过定义对象,将对象的地址赋给const对象的指针,注意:运行把非const对象的地址赋给指向const对象的指针。
const int *ptr;
int val = 1;
ptr = &val;
*ptr = 10; // error
int *ptr1 = &val;
*ptr1 = 10;
cout << *ptr << endl; // 10
我们不能通过const指针来修改val的值,即时它是非const对象。但当const指针指向非const的对象时,可用其他方法来修改对象的值,如通过非const指针进行修改。
2)指针常量
指针常量,重点为常量,因此const指针必须初始化,因为const指针的值不能修改。
int *const ptr; // error
int num=10;
int *const ptr = #
num = 0;
cout << *ptr <<endl; // cout:0
上述修改ptr指针所指向的值,也可以通过非const指针来修改。
给ptr进行赋值时,ptr指向的是一个变量,而不是const常量,因此:
const int num = 0;
int * const ptr = # // error: const int * -> int *
cout<<*ptr<<endl;
1)const修饰函数返回值
a. const int ,这个const跟修饰普通变量以及指针的含义基本相同;
b. const修饰函数指针所指向的变量不可变,const int * (类似变量指针)
c. const修饰函数指针不可变,int * const
const int func1();
const int * func2();
int *const func3();
2)const修饰函数参数
a. 修饰传递过来的形参及指针,表明参数在函数体内不能被修改,但由于函数形参在函数内本身就不会改变,const修饰没什么意义。
void func(const int var);
void func(int *const var);
b. const修饰指针,所指内容不可变。当函数中试图修改src的内容,编译会出错
void func(char *dst, const char *src); // src为输入参数,dst为输出参数
c. 当使用自定义类时,const修饰引用可以提高效率并防止修改
void func(A_class a_obj);
void func(const A_class & a_obj);
对于非内部数据类型参数来说,直接执行void func( A_class a_obj)是很低效的,因为函数体将产生A类的临时对象用于复制参数a,临时变量的构造会消耗大量时间,因此可以使用const修饰A,使其不用产生临时变量。
在一个类中,任何不会修改数据成员的函数都应声明为const,防止在调用函数时,因修改数据成员而导致编译错误。
注:对于类中const成员变量必须通过初始化列表进行初始化,如:
class Person
{
public:
Person(int i);
const int people_num;
private:
int people[100];
};
Person::Person(int i):people_num(i)
{ ... }
另外:const对象只能访问const成员函数,而非const对象没有限制,既可以访问const成员函数也可以访问非const成员函数。