关于const的各种用法

const T  定义一个常量并且需要初始化

const int v = 10;
v = 10 //报错

const T*  指向某个值,不能通过它来改变原来的值

int v = 10;
const int * vptr = &v;
*vptr = 11; //报错

T * const  说明不能修改这个指针的指向值

int v = 10;
int * const vptr = &v;
vptr = new int(2); //报错

const T&  常量引用,常量引用不能修改其绑定的值

int i = 5;
const int constInt = 10;
const int& rConstInt = constInt;    //正确,引用及邦定的值都是常量
rConstInt = 5;                      //错误,不能改变引用所指向的对象1
允许为一个常量引用邦定一个非常量对象、字面值,甚至是表达式;引用的类型与引用所指向的类型必须一致。

int i = 5;
int& rInt = i;                      //正确,int的引用
const int constInt = 10;
const int& rConstInt = constInt;    //正确,引用及邦定的值都是常量
const int& rConstInt2 = rInt;       //正确,用rInt邦定的对象进行赋值
rInt = 30;                          //这时,rConstInt2、rInt、i的值都为30
//rConstInt2 = 30;                  //错误,rConstInt2是常量引用,rConstInt2本身不能改变所指向的对象

int i2 = 15;
const int& rConstInt3 = i2;         //正确,用非常量的对象为其赋值
const int& rConstInt4 = i + i2;     //正确,用表达式为其赋值,值为45
i = 20;                             //此时i=20, rInt = 20, rConstInt4 = 45,说明rConstInt4邦定的是i + i2的临时变量
const int& rConstInt5 = 50;         //正解,用一个常量值为其赋值

const T* 和 T * const&

指向常量对象的指针的引用,这可以分两步来理解:1.const T*是指向常量的指针;2.const T*&指向常量的指针的引用。

const int nConstValue = 1;                      //常量对象
const int nConstValue2 = 2;                     //常量对象
const int* pConstValue = &nConstValue;          //指向常量对象的指针
const int* pConstValue2 = &nConstValue2;        //指向常量对象的指针
const int*& rpConstValue = pConstValue;         //指向常量对象的指针的引用
//*rpConstValue = 10;                           //错误,rpConstValue指向的是常量对象,常量对象的值不可改变
rpConstValue = pConstValue2;                    //正确,此时pConstValue的值等于pConstValue2
//指向常量对象的指针本身是对象,引用可以改变邦定对象的值

int nValue = 5;
int nValue2 = 10;
int *const constPoint = &nValue;                //常量指针
int *const constPoint2 = &nValue2;              //常量指针
int *const &rpConstPoint = constPoint;          //对常量指针的引用,邦定constPoint
//rpConstPoint = constPoint2;                   //错误,constPoint是常量指针,指针本身的值不可改变
*rpConstPoint = 20;                             //正确,指针指向的对象可以改变

应用:

1.希望传入一个对象,但又不想函数修改它

方式<1>

void Dealwith(const Data& data)
{
    cout << data.value << endl;
    //data.value = 5;       //错误,data是常量引用,不能改变其邦定的对象
}

这种方式还有一个好处是只有在调用函数的时候会邦定对象,传递的是对象的引用,而不是对象,减少函数调用时对象赋值的花销。

方式<2>

void Dealwith(const Data* pData)
{
    cout << pData->value << endl;
    //pData->value = 5;     //错误,pData是指向常量对象的指针,不能改变其指向的对象
}

这种方式与void Dealwith(const Data& data)的功能相同

方式<3>

Data g_data(20);
void Dealwith(const Data*& pData)
{
    cout << pData->value << endl;
    //pData->value = 5;     //错误,pData邦定的是指向常量对象的指针,常量对象的指针不能改变其指向的对象
    pData = &g_data;        //正确,pData是[指向常量对象的指针]的引用,引用可改变其邦定的对象
}

2.返回一个类的成员,但不希望调用方修改

class MyData
{
public :
    MyData(std::string name, Data data)
    {
        m_name = name;
        m_data = data;
    }

    const Data* GetData()
    {
        return &m_data;
    }

private:
    std::string m_name;
    Data m_data;
};

MyData mydata("", Data(100));
const Data* pData = mydata.GetData();
cout << pData->value << endl;   //pData->value = 100
//pData->value = 50;            //错误,pData是指向常量对象的指向,不能改变其指向对象的值 
 
时间: 2024-10-04 22:08:01

关于const的各种用法的相关文章

C/C++中的const真正的用法

const基础知识(用法.含义.好处) intmain() { constint a; intconst b; constint *c; int* const d; constint * const e ; return0; } Intfunc1(const ) 初级理解:const是定义常量==>const意味着只读 含义: //第一个第二个意思一样代表一个常整形数 //第三个c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改) //第四个d常指针(指针变量不能被修改,但

C++中const 的各种用法

C++中const 关键字的用法 const修饰变量 const 主要用于把一个对象转换成一个常量,例如: const int size = 512; size = 0; // error: assignment of read-only variable 上面的例子中,定义size为常量并初始化为512,变量size仍是一个左值,但是现在这个左值是不可修改的,任何修改size的尝试都会导致编译错误. 因为常量在定以后就不能被修改,因此const对象定义时必须初始化,否则会引起编译错误,例如:

const 和 extern 用法小結

 雖說不難,但很重要!! 1.       const常量,如const int max = 100;  优点:const常量有数据类型,而宏常量没有数据类型.编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误(边际效应) 2.       const 修饰类的数据成员.如:class A { const int size; … } const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的.因为类可以创建多个对象,

C语言中const关键字的用法

转载请注明出处http://blog.csdn.net/xingjiarong/article/details/47282255 关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const呢,我想事物的存在一定有它自己的道理,所以说const的存在一定有它的合理性,与预编译指令相比,const修饰符有以下的优点: 1.预编译指令只是对值进行简单的替换,不能进行类型检查 2.可以保护被修饰的东

C/C++中const关键字的用法及其与宏定义的比较

1.const关键字的性质 简单来说:const关键字修饰的变量具有常属性. 即它所修饰的变量不能被修改. 2.修饰局部变量 1 const int a = 10; 2 int const b = 20; 这两种写法是等价的,都是表示变量的值不能被改变,需要注意的是,用const修饰变量时,一定要给变量初始化,否则之后就不能再进行赋值了,而且编译器也不允许不赋初值的写法: 在C++中不赋初值的表达一写出来,编译器即报错,且编译不通过. 在C中不赋初值的表达写出来时不报错,编译时只有警告,编译可以

小胖说事28------iOS中extern,static和const区别和用法

通俗的讲: extern字段使用的时候,声明的变量为全局变量,都可以调用,也有这样一种比较狭义的说法:extern可以扩展一个类中的变量到另一个类中: static声明的变量是静态变量,变量值改变过之后,保存这次改变,每次使用的时候都要读取一遍值: const声明过得变量值是不可改变的,是readonly的属性,不可以改变变量的值. 具体用法: 1.static的用法:static NSString *str = @"哈哈"; 2.const的用法:NSString *const st

const限定符用法汇总

const限定符限定变量的类型是一个常量,对象一旦创建后其值就无法改变,所以const对象必须初始化. 初始化 const int i = get_size(); //运行时初始化 const int j = 42; //编译时初始化 int k = 40; const int ck = k; //k的值 被拷贝给了ck const对象的作用域 默认情况下,const对象仅在文件内有效. 如果要在多个文件中共享const对象,必须在变量的定义之前添加extern关键字. //file_1.cc定

php final static const成员属性用法

http://www.111cn.net/phper/php/38976.htm 首先来说说final 1.final不能用来修饰成员属性 2.final只能修饰类和方法 作用:被修饰的类不能被子类所继承:被修饰的方法不能被子类的方法覆盖. < ?PHP final class BaseClass { public function test() { echo "BaseClass::test() calledn"; } final public function moreTes

C++中的const关键字的用法

1.const用于修饰普通变量,表示常量,不建议修改,某种程度上不允许修改(其实也是可以修改的) 指针常量 :指针(指向的变量的值)自身是一个常量,说明不能改变自身的指向  int* const p=&a;  常量指针 :指向常量的指针,指针可以修改指向 但是不能修改指向的变量的值  const int* p;面试必杀技: const出现在*的左边    是常量指针 const int num = 19; const int * p = &num;//指向常量的指针 常见的面试题中,经常会