当前位置:编程学习 > C/C++ >>

刨根问底系列之C++ const 挖掘

一、 const的作用:

     1、限定const指定的值的修改

          ex1.1:

          const int a = 2;

          //a = 3;  error: assignment of read-only variable

     就如C语言里宏一样,a会被放到符号列表里,不过a是内部链接的(内部链接是指只在当前文件内是可见的)。当不取a的地址的时候,系统不会给a分配内存,取a地址的时候就会给a分配地址,但改变a指向的内容并不能改变a的值,因为a已经被编译成为符号了。改变a内存所指内容是没有任何结果的。

          ex1.2:

[cpp] 
#include <iostream> 
using namespace std; 
int main() { 
    const int ci = 2; 
    cout<<"the addr of ci is:"<<(&ci)<<endl; 
    int *p = const_cast<int*>(&ci); 
    cout<<"the addr of p is:"<<p<<endl; 
    *p = 5; 
    cout<<"the value of ci is:"<<ci<<endl; 
    cout<<"the value of p is:"<<(*p)<<endl; 
    return 0; 

          输出结果为:

         

     2、限定函数返回值的修改,限定函数内容的修改

          函数返回值加上const,防止赋值运算,member function加上const 限定,防止对象member data修改。

          ex1.3:

[cpp] 
#include <iostream> 
using namespace std; 
class Test{ 
    public: 
        Test(); 
        ~Test(); 
        Test& GetTest() { 
            return *this; 
        } 
        const Test& GetConstTest(){ 
            return *this; 
        } 
 
        const Test& operator=(const Test& other) { 
            this->value_ = other.value_; 
            return *this; 
        } 
 
        int ChangeValue(int value) const { 
            //value_ = value;   error: value_ is read only 
            return value_; 
        } 
    private: 
        int value_; 
}; 
int main() { 
    Test test; 
    test.GetTest() = test; 
    //test.GetConstTest() = test; //error can't assignment to return value 
    return 0; 

 
          在函数member function GetConstTest() 里返回值是const属性的,所以不能为返回值赋值。在ChangeValue里member function 被限定为const 成员函数,所以在内部不能修改member data value_ 的指。

     3、程序的可读性

          加上const限定,可以很清楚的告诉编译器和程序员,这个数值不可以修改。同时将函数参数定义为const 引用,这样和传递值的感觉是一样的,防止程序传递整个对象。

     4、程序的效率

          在函数参数的传递过程中,变量都是按值拷贝传递的,如果是内置类型的话,占用内存空间少,拷贝一下数值无关紧要。但是自定     义类就没想像的简单了。在参数传递过程中,如果是按值传递的话,对象会调用自己的构造函数,并且将整个对象内容拷贝过去,这对于占用内存较多的类还是非常损耗效率的。如果定义为引用或者指针传递的话拷贝指针值就可以了。

     5、代替部分宏的职责

          C语言之所以在发明的时候受到了各方程序员的万般宠爱,很大一部分原因就是C语言里的宏。宏不仅可以定义全局数据符号,并且还可以用来构造非常精妙的函数。定义常用的变量,常用的函数非常方便。在方便的同时也有很多问题,比如说没有类型检查,只是机械的替换,比如说经典的”Max 宏函数“各种错误。看下面的例子。

          ex1.4:

[cpp]
#include <iostream> 
using namespace std; 
#define PI 3.14 
#define Log(str) cout<<str<<endl 
#define Max(a, b) a > b ? a : b 
 
int main() { 
    int a = 12; 
    int b = 5; 
    int max = Max(a, b); 
    Log(PI); 
    Log(max); 
    Log("hello, world"); 
    return 0; 

          但是通过C++里的const就能很好的规避一些问题

          1、类型检查

          2、名称冲突,因为宏定义变量是外链接的

          3、调试代码效率问题上,如果在宏变量的地方出错了,编译器只是将宏变量代替为值,所以当看到对应的值的时候,会非常奇怪这个值是那里来的,但是对于const变量可以很清楚的知道是那个变量。

 

二、const的用法

     1、限定内置常量

          限定常量很简单,在定义const变量的时候必须初始化,初始化的值可以是常量,也可是变量。

          ex2.1:

     2、限定指针和引用

          指针地址是程序运行的时候为变量分配的内存,所以const指针是不需要初始化的。由于const放的位置不同,对应限制的值也不同。通用的方法就是看const和变量的位置。

[cpp] 
int num = 2; 
int other = 3; 
 
// assignment 
const int* ptr1 = &num 
int const* ptr2 = &num 
int *const ptr3 = &num 
const int* const ptr4 = &num 
 
// change value 
ptr1 = &other; 
ptr2 = &other; 
// ptr3 = &other;     // read only error 
// ptr4 = &other;     // read only error 
 
// *ptr1 = other;     // read only error 
// *ptr2 = other;     // read only error 
*ptr3 = other;      
// *ptr4 = other;     // read only error 


     3、限定对象

     const 在限定对象使用要点:

     1、按位限制,对象占用的内存不可改变,将this指针转为非const指针就可以改变member data。

    

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,