const变量讲解

转载至:https://blog.csdn.net/m0_37570217/article/details/100541004

一、const常量
在 C++ 中,有两种简单的定义常量的方式:

1、使用 #define 预处理器。

#define LENGTH 10   
#define WIDTH  5
#define NEWLINE '\n'
2、使用 const 关键字。

const int  LENGTH = 10;
const int  WIDTH  = 5;
const char NEWLINE = '\n';
注意:

a、常量必须初始化,且不能复制。

b、把常量定义为大写字母形式,是一个很好的编程习惯。

c、通过const_cast是可以修改常量值,但是便失去了定义常量的意义。

二、const指针
const 修饰指针有三种作用:三种写法不同,作用也不同。

1、指向const的指针,有两种写法

const int* p; (推荐)
int const* p;
p本身不用初始化它可以指向int变量,但它指向的内容的值是不能被改变的。

2、const指针

int* const p = 一个地址;// 因为指针本身的值是不能被修改的所以它必须被初始化
指针本身的值(即指向内容)是不能被修改,但它指向内容的值却是可以修改的。

3、指向const的const指针

const int* const p=一个地址;
int const* const p=一个地址;
此情况是这个指针本身(即指向内容)和它指向的内容的值都是不能被改变的

详细使用案例如下:(转载自:https://www.cnblogs.com/lihuidashen/p/4378884.html)

using namespace std;
 
int main(int argc, char *argv[])
{
    int a=3;
    int b;
    
    /*定义指向const的指针(指针指向的内容的值不能被修改)*/ 
    const int* p1; 
    int const* p2; 
    
    /*定义const指针(由于指针本身的值(即指向内容)不能改变所以必须得初始化)*/ 
    int* const p3=&a; 
    
    /*指针本身(即指向内容)和它指向的内容的值都是不能被改变的所以也得初始化*/
    const int* const p4=&a;
    int const* const p5=&b; 
    
     p1=p2=&a; //正确
     *p1=*p2=8; //不正确(指针指向的内容的值不能被修改)
    
     *p3=5; //正确
     p3=p1; //不正确(指针本身(即指向内容)不能改变) 
    
     p4=p5;//不正确 (指针本身(即指向内容)和它指向的内容的值都是不能被改变) 
     *p4=*p5=4; //不正确(指针本身(即指向内容)和它指向的内容的值都是不能被改变) 
     
    return 0; 
}
三、const函数
const修饰函数有两种形式:函数名前与函数名后,意义也大不相同。

1、const位于函数名前,表示函数返回值是const常量

2、const位于函数名后,表示该函数为常函数,该函数不会改变成员变量值,一般用于只读函数。当成员函数被声明为const时,如果试图修改对象的数据,编译器将视为错误。

四、const对象
1、如果声明了一个指向const对象的指针,则通过该指针只能调用const方法(成员函数)。

class Rectangle
{
     pubilc:
        void SetLength(int length){itslength = length;}
        int GetLength() const {return itslength;} 
         //成员函数声明为常量,则该函数是只读函数
     private:
        int itslength;
        int itswidth;
};
Rectangle* pRect = new Rectangle;
 
const Rectangle * pConstRect = new Rectangle;     //指向const对象
 
// pConstRect是指向const对象的指针,它只能使用声明为const的成员函数,如GetLength()。
2、 const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数。
3、 const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的。
4、const成员函数不可以修改对象的数据,不管对象是否具有const性质.它在编译时,以是否修改成员数据为依据,进行检查。
5、然而加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的const成员函数是可以修改它的。

五、const参数
1、如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const 修饰,否则该参数将失去输出功能。
2、const 只能修饰输入参数:如果输入参数采用“指针传递”,那么加const 修饰可以防止意外地改动该指针,起到保护作用。

      a、对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const 引用传递”,目的是提高效率。例如:

void Func(A a) {}//值传递需要大量复制操作
 
void Func(const A &a){}//const引用传递,提升性能,同时保证安全
     b、对于内部数据类型的输入参数,不要将“值传递”的方式改为“const 引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如:

void Func(int a) {}//常规写法
 
void Func(const int &a){}//没有意义
六、const 返回值
1、如果给以“指针传递”方式的函数返回值加const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。例如:

const char * GetString(void);
 
char *str = GetString();//语句将出现编译错误:
 
const char *str = GetString();//正确的用法
2、如果返回值不是内部数据类型,将函数A GetA(void) 改写为const A & GetA(void)的确能提高效率。但此时千万千万要小心,一定要搞清楚函数究竟是想返回一个对象的“拷贝”还是仅返回“别名”就可以了,否则程序会出错。
函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目的是为了实现链式表达。

class A
{
    A & operate = (const A &other); // 赋值函数
};
A a, b, c; // a, b, c 为A 的对象
a = b = c; // 正常的链式赋值
(a = b) = c; // 不正常的链式赋值,但合法
 
————————————————
版权声明:本文为CSDN博主「Chen-FangLiang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_37570217/article/details/100541004

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值