C++复习1.const用法

定义常量

指针相关

(1)指针本身是常量不可变

char* const p; 

(2)指针所指向的内容是常量不可变

 const char *p; 

(3)两者都不可变

 const char* const p; 

关于指针和引用:
1.
const int* p = &x; //声明p为指向常量x的指针,p指向的对象不能被修改,但它可以指向任何地址的常量,例如:
int i = 10;
const int *p = &i;
*p = 11; // wrong
i = 11; // correct

2.int const *p =&x; // 与用法1同
3.int* const p = &x; // 声明p为一个常量指针,它指向x,p这个指针的指向不能被修改,但是它指向的地址的内容可以修改
4.const int* const p = &x; // 综合用法1和用法2,p是一个指向常量的常量性指针
5.const double& v; // 该引用所引用的对象不能被更新
总结:如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。

函数相关

(1)const修饰函数参数

a.传递过来的参数在函数内不可以改变(无意义,因为Var本身就是形参)
void function(const int Var);
b.参数指针所指内容为常量不可变
void function(const char* val);
c.参数指针本身为常量不可变(也无意义,因为char* val也是形参)
void function(char* const val);
d.参数为引用,为了增加效率同时防止修改。修饰引用参数时:
void function(const Class& val); //引用参数在函数内不可以改变
void function(const TYPE& val); //引用参数在函数内为常量不可变
补充:a.对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const 引用传递”,目的是提高效率。
例如:将void Func(A a) 改为void Func(const A &a)。
因为函数体内将产生A 类型的临时对象用于复制参数a,而临时对象的构造、复制、析构过程都将消耗时间;“引用传递”仅借用一下参数的别名而已,不需要产生临时对象。
b.对于内部数据类型的输入参数,不要将“值传递”的方式改为“const 引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。
例如:void Func(int x) 不应该改为void Func(const int &x)。
因为内部数据类型的参数不存在构造、析构的过程,而复制也非常快,“值传递”和“引用传递”的效率几乎相当。

类相关

(1)const修饰成员变量

1°const修饰类的成员函数,表示成员常量不能被修改/不会修改数据成员,同时它只能在初始化列表中赋值。//第一次知道
  class A {const int n;         //成员常量不能被修改
        …
        A(int x): n(x) { } ; //只能在初始化列表中赋值
     } 

初始化const int类型(没有static),在类的构造函数上初始化

Class Test {
 Public:
  Test():b(23) {//构造函数上初始化b的值为23
  }
 private:
  const int b ;
}
2°使用const修饰的变量必须初始化,在类中又不能在定义时初始化,

如;

class {
  private:
  int a = 10;
  const int b = 10;
  static const int c = 10;
//这样初始化都是错的,
}
3°初始化static const int这个类型的(带有static的),在类的外面初始化
class Test {
private:
  static const int c;
};
const int Test::c=10; //类的外部初始化c为10
*const定义的对象变量*只能作用于这个程序该C/C++文件,不能被该程序的其他C/C++文件调用,

如file1.cpp中 const int val;
在file2.cpp中, extern int val; //错误,无法调用,
要想const定义的对象变量能被其他文件调用,定义时必须使用extern修饰为
extern const int val;
非const变量默认为extern,要是const能被其他文件访问必须显示指定为extern

(2)const修饰成员函数

const修饰类的成员函数,则该成员函数不能修改类中任何非const成员函数。一般写在函数的最后来修饰。

    class A {void function()const; //常成员函数, 它不改变对象的成员变量.                        
       //也不能调用类中任何非const成员函数。
    }

对于const类对象/指针/引用,只能调用类的const成员函数,因此,const修饰成员函数的最重要作用就是限制对于const对象的使用。

a. const成员函数不被允许修改它所在对象的任何一个数据成员。
b. const成员函数能够访问对象的const成员,而其他成员函数不可以。

(3)const修饰类对象/对象指针/对象引用

·const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是一样。
·const修饰的对象,该对象的任何非const成员函数都不能被调用,因为任何非const成员函数会有修改成员变量的企图。
例如:

class A { 
    void func1(); 
    void func2() const; 
} 
const A aObj; 
aObj.func1(); ×
aObj.func2(); 正确

const AAA* aObj = new AAA(); 
aObj-> func1(); ×
aObj-> func2(); 正确

ps:以上转载改编自
关于C++ const 的全面总结
总结const的用法
const的常见用法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值