C++学习笔记之const

此文章作为学习笔记,记录在学习过程中遇到的一些知识点,如果有任何错误,欢迎指出~

1.const含义

const的全称为constant,译为常量。
我们通常把使用类修饰符const的类型称为常类型,常类型的变量或对象的值是不能被更新的。

2.const作用

2.1 定义常量

const可以对常量进行定义,被const定义的变量禁止修改,起保护作用,增加了程序的健壮性。
const类型变量必须进行初始化,因为其被定义后不能被修改,所以必须进行初始化。

const int temp = 100;
temp = 101; // error: const不允许修改

const int i,j=0; // erroe:const类型必须进行初始化

const string s = "hello world"; // right

2.2 const与指针

与指针相关的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;
num = 0;
cout << *ptr <<endl; // cout:0

上述修改ptr指针所指向的值,也可以通过非const指针来修改。
给ptr进行赋值时,ptr指向的是一个变量,而不是const常量,因此:

const int num = 0;
int * const ptr = &num;  // error: const int * -> int *
cout<<*ptr<<endl;  

2.3 const与函数

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,使其不用产生临时变量。

2.4 const与类

在一个类中,任何不会修改数据成员的函数都应声明为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成员函数。

你可能感兴趣的:(C++学习,c++,编程语言)