看到const关键字,可能首先想到的是const常量,const不仅可以修饰常量,还可以修饰函数的参数 函数的返回值,以及成员函数。 (1)const修饰函数参数 1.如果输入的参数采用“指针传递”,那么加上const可以防止意外的改动该指针,起到保护作用 例如:void func(char *dest_str, const char *src_str) 2.如果输入参数采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就不需要保护所以 不用加const也可以 例如:void func(int x)不用写成void func(const int x) 3.但是对于非内部的数据类型的参数而言,例如void func( A a)这样声明的函数注定效率低,因为函数体内 将自动产生临时对象,用于复制该参数a,而临时变量的构造,拷贝构造,析构都将耗费时间。所以为了提高效率 可以写成这样void func(A &a)用“引用传递”就不用产生临时对象,如果不想改变参数a就写成 void func(const A &a) (2)const修饰函数返回值 1.以“指针传递”方式的函数返回值加上const修饰,那么该函数的返回值的内容不能被修改 例如:const char *get_string(void) 2.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部的临时存储单元中,所以加上const修饰 没有意义, 例如:int get_number(void)不用写成const int get_number(void) 3.但是返回值不是内部数据类型,例如:A get_string(void),这样会产生一个临时的对象用来存放返回的数据, 会调用拷贝构造函数,这样效率会低,所以采用“引用传递”A &get_string(void),如果加上const那么返回值的 内容就不会被改变const A &get_string(void) (3)const修饰成员函数 1.任何不会修改成员的函数都应该声明为const类型。 例如计数函数不会对成员进行修改所以int get_count(void)const;注意const成员函数的声明将const放到 函数的尾部。 2.const成员函数不可以修改对象的数据。 const对象只能访问const成员函数,非const对象可以任意访问任意的成员函数。 3.class A{ public: int get_count(int)const; } int get_count(int)const准确的说这个const修饰的是this指向的对象,其实get_count(int)这个函数在 调用方法时会被编译器改写成get_count(A *const this, int)const;为了不允许get_count()这个函数改变 this指向的对象,则用const修饰这个函数,因此this指针的类型变为const A *const this
const修饰函数参数,返回值,成员函数
最新推荐文章于 2024-08-12 06:56:38 发布