c++中const关键字除了修饰变量,指针等,还可以修饰函数,函数参数和函数的返回值。
在c++,通过const修饰类的成员函数,表明该成员函数不能修改对象的数据成员和调用非const修饰的函数。由于非const修饰的函数中可能会修改对象的数据成员,而const修饰的成员函数是不允许修改对象的数据成员的,因此const函数不能调用非const函数。
#include<iostream> using namespace std; class Test { private: int a; public: void set_val(int n)//set_val函数用来设置成员变量a的值,声明为const函数会报错 { a = n; } int get_val() const //get_val函数返回a的值,不需要修改a的值,可以声明为const,同时可以保护a的值不被修改 { //a = 4;//函数内修改a的值则报错 return a; } }; int main() { Test obj1; obj1.set_val(5); int val = obj1.get_val(); cout << val << endl; return 0; }
c++中利用const修饰成员函数的形参,可以防止传入的参数被函数内部逻辑修改,在参数类型为引用和指针时起作用,如果是传值,即使在函数内部修改了形参的值,对实参也不影响。
#include<iostream> #include <string.h> using namespace std; class Test { private: int a; public: void set_val(const int n)// { //n = 20;//报错,const修饰形参,不能进行修改 a = n; } void print_val() { cout << a << endl; } void str_cpy(const char *src, char *dst) { if (src && dst) { strcpy_s(dst,strlen(src)+1,src);//注意使用strlen求字符串长度必须加上‘\0‘的空间 } } }; int main() { Test obj1; obj1.set_val(5); obj1.print_val(); char src[] = "test", dst[16] = { 0 }; obj1.str_cpy(src, dst); cout << dst << endl; return 0; }
在函数str_cpy中,源字符串使用const修饰,表示在函数体内不能修改源字符串指针所指内容,能够保护源字符串被误改。
同时:函数的参数使用const修饰时,既可以接收const修饰的同类型参数,也可以接收非const修饰的同类型的参数。
为了提高程序的效率,我们常常在传递参数时使用引用或指针,而传引用或指针存在安全隐患,为了保护实参的安全,可以使用const修饰需要保护的实参。
使用const修饰函数的返回指针或者引用,可以保护指针指向内容和引用内容不能被外部修改。
#include<iostream> using namespace std; class Test { private: int a; public: void set_val(const int n)// { a = n; } const int* get_val()//const修饰函数的返回值 { return &a; } }; int main() { Test obj1; obj1.set_val(5); const int *n = obj1.get_val(); //*n = 5;//报错 cout << *n << endl; return 0; }
原文:https://www.cnblogs.com/cycit/p/13581008.html