© 本贴为 xxtz 原创/首发,严禁抄袭!
const名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。习惯性的使用const,可以避免在函数中对某些不应修改的变量造成可能的改动。
1.const修饰基本数据类型
1.1 修饰一般常量及数组 int const arr[2]={1,2} 等价与 const int arr[2]={1,2}
1.2 修饰指针(*)
顶层const 和 底层const,前者(比如int* const p=a,本质是一个常量型的指针,常量指针)可以表示任意对象的常量(指针、引用、int、double都可以),后者(比如const int* p=a,指针所指的对象是常量,指针常量)只有指针和引用等复合类型可以是。
根据const位于星号*的左右侧,有通俗理解:左定值,右定向,const修饰不变量。
当执行对象的拷贝操作时,拷入和拷出的对象必须具有相同的底层const资格,或者两个对象的数据类型必须能够转换才行。一般来说,非常量可以转换成常量,反之则不行。
2.const 修饰函数
const 在函数中根据修饰的位置分为三种:函数参数、函数返回值、成员函数。
const int fun(const int a) const;
2.1 如果输入参数为指针,如
void stringcopy(char* strdest, const char* strsource);
加上const之后就会起保护指针意外修改的作用。实参中,指针会指向一段内存地址,调用函数之后,函数会产生一个临时指针变量,这个变量的地址与实参的地址不一样,但是这两个指针指向的内存是同一块。加上const修饰后,如刻意修改这一内存,编译器会报错。
2.1 如果输入参数为引用(引用是某个实例的别名,程序为指针变量分配内存区域;而不为引用分配内存区域),加上const 之后既起到了保护作用,也提高了程序效率。调用void func(A a) ,其中A是用户自定义的类型。程序会产生一个临时对象,随后调用拷贝构造函数,当函数结束的时候,进行析构释放资源。如果改成引用void func(A &a); 只是相当于实参的一个别名,不会产生临时变量,所以自定义类型,建议用引用作为函数形参。
2.2 const修饰返回值。 值传递是没有必要用此修饰。返回值是指针,接收的变量也必须是const修饰,如
const char* func(); const char* sr=func();
2.3 const 修饰的成员函数(void func(int x) const;)为了保护成员变量,要求const 函数不能修改成员变量,否则编译会报错。只有成员函数才可以在后面加const,普通函数后加const无意义。
const函数的规则:
1. const 对象只能访问const 成员函数,非const 的对象可以访问任何成员函数,包括const 成员函数。
2.如果函数名、参数、返回值都相同的const成员函数和非const成员函数是可以构成重载,那么const对象调用const成员函数,非const对象默认调用非const的成员函数。
3.const成员函数可以访问所有成员变量,但是只能访问const的成员函数。
4.非const成员函数,可以访问任何成员,包括const成员成员函数。
5.const成员函数不能修改任何的成员变量,除非变量用mutable修饰。
const全局变量在其他文件中是不可见的,这和添加了static关键字的效果类似。 |