`

C++中Const关键字总结

阅读更多
对于基本声明  
  1. const   int   r=100;   //标准const变量声明加初始化,因为默认内部连接所以必须被初始化,其作用域为此文件,编译器经过类型检查后直接用100在编译时替换  
   
  2. extend   const   int   r=100;   //将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义  
   
  3. const   int   r[   ]={1,2,3,4};   
    struct   S   {int   a,b;};  
   const   S   s[   ]={(1,2),(3.4)};   //以上两种都是常量集合,编译器会为其分配内存,所以不能在编译期间使用其中的值,例如:int   temp[r[2]];这样的编译器会报告不能找到常量表达式   
    
对于指针   
 1. const   int   *r=&x;   //声明r为一个指向常量的x的指针,r指向的对象不能被修改,但他可以指向任何地址的常量   
 2. int   const   *r=&x;   //与用法1完全等价,没有任何区别   
 3. int   *   const   r=&x;   //声明r为一个常量指针,他指向x,r这个指针的指向不能被修改,但他指向的地址的内容可以修改   
 4. const   int   *   const   r=&x;   //综合1、3用法,r是一个指向常量的常量型指针   
    
对于类型检查  
        可以把一个非const对象赋给一个指向const的指针,因为有时候我们不想从这个指针来修改其对象的值;但是不可以把一个const对象赋值给一个非const指针,因为这样可能会通过这个指针改变指向对象的值,但也存在使这种操作通过的合法化写法,使用类型强制转换可以通过指针改变const对象:  
  const   int   r=100;  
  int   *   ptr   =   const_cast<int*>(&r);     //C++标准,C语言使用:int   *   ptr   =(int*)&r;   
    
对于字符数组  
  如char   *   name   =   “china”;   这样的语句,在编译时是能够通过的,但是”china”是常量字符数组,任何想修改他的操作也能通过编译但会引起运行时错误,如果我们想修改字符数组的话就要使用char   name[   ]   =   “china”;   这种形式。   
    
对于函数   
1. void   Fuction1   (   const   int   r   );   //此处为参数传递const值,意义是变量初值不能被函数改变   
    
2. const   int   Fuction1   (int);   //此处返回const值,意思指返回的原函数里的变量的初值不能被修改,但是函数按值返回的这个变量被制成副本,能不能被修改就没有了意义,它可以被赋给任何的const或非const类型变量,完全不需要加上这个const关键字。但这只对于内部类型而言(因为内部类型返回的肯定是一个值,而不会返回一个变量,不会作为左值使用),对于用户自定义类型,返回值是常量是非常重要的,见下面条款3  

3. Class   CX;   //内部有构造函数,声明如CX(int   r   =0)  
  CX     Fuction1   ()   {   return   CX();   }  
  const   CX   Fuction2   ()   {   return   CX();   }  
  如有上面的自定义类CX,和函数Fuction1()和Fuction2(),我们进行如下操作时:  
  Fuction1()   =   CX(1);   //没有问题,可以作为左值调用  
  Fuction2()   =   CX(1);   //编译错误,const返回值禁止作为左值调用。因为左值把返回值作为变量会修改其返回值,const声明禁止这种修改。   
    
 4. 函数中指针的const传递和返回:  
  int   F1   (const   char   *   pstr);   //作为传递的时候使用const修饰可以保证不会通过这个指针来修改传递参数的初值,这里在函数内部任何修改*pstr的企图都会引起编译错误。  
  const   char   *   F2   ();   //意义是函数返回的指针指向的对象是一个const对象,它必须赋给一个同样是指向const对象的指针。  
  const   char   *   const   F3();   //比上面多了一个const,这个const的意义只是在他被用作左值时有效,它表明了这个指针除了指向const对象外,它本身也不能被修改,所以就不能当作左值来处理。   
    
 5. 函数中引用的const传递:  
  void   F1   (   const   X&   px);   //这样的一个const引用传递和最普通的函数按值传递的效果是一模一样的,他禁止对引用的对象的一切修改,唯一不同的是按值传递会先建立一个类对象的副本,然后传递过去,而它直接传递地址,所以这种传递比按值传递更有效。  
  **另外只有引用的const传递可以传递一个临时对象,因为临时对象都是const属性,且是不可见的,他短时间存在一个局部域中,所以不能使用指针,只有引用的const传递能够捕捉到这个家伙。  
   
   
  对于类  
  1. 首先,对于const的成员变量,只能在构造函数里使用初始化成员列表来初始化,试图在构造函数体内进行初始化const成员变量会引起编译错误。初始化成员列表形如:  
  X::   X   (   int   ir   ):   r(ir)   {}   //假设r是类X的const成员变量  
   
  2. const成员函数。提到这个概念首先要谈到const对象,正象内置类型能够定义const对象一样(const   int   r=10;),用户自定义类型也可以定义const对象(const   X   px(10);),编译器要保证这个对象在其生命周期内不能够被改变。如果你定义了这样的一个const对象,那么对于这个对象的一切非const成员函数的调用,编译器为了保证对象的const特性,都会禁止并在编译期间报错。所以如果你想让你的成员函数能够在const对象上进行操作的话,就要把这个函数声明为const成员函数。假如f(   )是类中的成员函数的话,它的声明形如:  
  int   f(   )   const;   //const放在函数的最后,编译器会对这个函数进行检查,在这个函数中的任何试图改变成员变量和调用非const成员函数的操作都被视为非法  
  **类的构造和析构函数都不能是const函数。  
   
  3. 建立了一个const成员函数,但仍然想用这个函数改变对象内部的数据。这样的一个要求也会经常遇到,尤其是在一个苛刻的面试考官那里。首先我们要弄清楚考官的要求,因为有两种方法可以实现,如果这位考官要求不改变原来类的任何东西,只让你从当前这个const成员函数入手,那么你只有使用前面提到的类型强制转换方法。实例如下:  
  //假如有一个叫做X的类,它有一个int成员变量r,我们需要通过一个const成员函数f(   )来对这个r进行++r操作,代码如下  
  void   X::f(   )   const  
  {     (const_cast<X*>(this))   ->   ++r;     }   //通过this指针进行类型强制转换实现  
   
  另外一种方法就是使用关键字:mutable。如果你的成员变量在定义时是这个样子的:  
  mutable   int   r   ;  
  那么它就告诉编译器这个成员变量可以通过const成员函数改变。编译器就不会再理会对他的检查了。  
分享到:
评论

相关推荐

    c++中const关键字使用详解

    总结,const关键字在C++编程中扮演着重要的角色,合理地使用const不仅可以提升代码的安全性和可读性,还可以提高代码的维护效率。在编程实践中,应充分理解和利用const的特性,编写出更加健壮的代码。

    C++中const关键字用法详解及实例和源码下载

    现在读到了const关键字的用法,书上面讲解的时候并没有给出完整的实例,只是理论的讲解了一些知识,后来在网上面搜了关于const的关键字的讲解,但是搜到的内容和书上面讲解的内容有着非常让人疑惑的东西,看看下面的...

    C++中const关键字详解

    ### C++中const关键字详解 #### 一、引言 在C++编程语言中,`const`关键字是一个非常重要的概念,它被广泛用于各种上下文中,以提高代码的安全性、可读性和效率。本文将详细介绍`const`关键字的用法及其在不同场景...

    C++const关键字详解

    ### C++中的`const`关键字详解 在C++编程语言中,`const`关键字是一个非常重要的概念,它用于声明常量、限定函数参数以及优化内存管理。本文将深入探讨`const`关键字的各种用法和其背后的原理,帮助读者更全面地...

    C++语言const 关键字使用方法图文详解

    在C++编程语言中,`const`关键字是一个非常重要的元素,用于限定变量、函数参数、成员函数等,确保它们在程序执行过程中不可修改。本文将详细介绍`const`关键字的使用方法,包括它如何应用于成员变量、成员函数、...

    const关键字使用总结

    ### C/C++中的`const`关键字详解 #### 一、`const`的作用 `const`关键字在C/C++中有着广泛的应用,它主要用于定义不可更改的变量或对象,以此提高程序的安全性和可维护性。 **1. 定义`const`常量** - **作用**...

    C++中static关键字总结

    总结来说,C++中的static关键字提供了一种机制,可以控制变量和函数的作用域和生命周期,使其在需要的地方得到合理的存储和访问。正确地理解和使用static关键字,可以帮助编写出更加高效、安全和易于维护的代码。

    const关键字详解

    const关键字是C++中一个非常重要的关键字,其主要用途是限定变量的读写权限,从而提高程序的健壮性。下面将通过对const关键字的详细解释来展示其灵活的用法。 1. 限定符声明变量只能被读 const关键字可以限定变量...

    浅析c++ 中const关键字

    浅析C++ 中const关键字 C++ 中的const关键字是一个限定符,它限定一个变量不允许被改变。使用const可以在一定程度上提高程序的安全性和可靠性。当我们在编写程序时,可能会遇到一些变量不需要被改变的情况,这时...

    C++编程中的const关键字常见用法总结

    在C++编程中,`const`关键字是一种非常重要的特性,用于定义常量、限制指针和引用的行为,以及约束函数的副作用。以下是`const`关键字的一些常见用法: 1. **定义常量**: `const`关键字可以用来声明常量,确保...

    C++中const用法总结

    ### C++中const用法总结 #### 一、引言 `const` 是 C++ 中一个非常重要的关键字,用于声明常量或指定某些实体不可被修改。熟练掌握 `const` 的使用方法对于编写高质量的 C++ 代码至关重要。本文将详细介绍 `const`...

    c++中关键字const的用法详解

    本文档详细介绍了C++中关键字const的用法,并给出了具体的示例来帮助读者理解

    C中const和C++中const区别

    C中const和C++中const...在C语言中,const关键字只是表示该变量不能被赋值,而在C++中,const关键字确实可以防止通过程序的内部(或者说外部)的方法来修改这个值。我们需要根据不同的语言环境来正确使用const关键字。

    详解C/C++中const关键字的用法及其与宏常量的比较

    总结来说,const关键字在C/C++中的作用非常强大,它不仅可以保证变量的值不被修改,提高程序的安全性,还能在编译期就发现潜在的逻辑错误,提升代码的可靠性。而与宏常量相比,const关键字提供了更强的类型检查和...

    C++中的关键字解析

    ### C++中的关键字解析 #### 一、保留字与关键字 C++中存在大量预定义的标识符,这些标识符通常被称为保留字或关键字。它们具有特定的意义,并且被编译器用来识别语言结构的不同部分。例如,在C++中,“`auto`”、...

    C++ const关键字的实例用法

    "C++ const关键字的实例用法" 以下是关于C++ const关键字的实例用法...10. 总结:const关键字是一个非常重要的概念,在C++中有广泛的应用场景,了解const关键字的实例用法可以帮助开发者更好地编写高效、可靠的程序。

    浅谈C++中的几个关键字static,const,inline.doc

    "C++中的static、const、inline关键字详解" C++ 中的 static 关键字是一种非常重要的修饰符,它可以控制变量的存储方式和可见性。静态变量的两大作用是控制存储方式和控制可见性。控制存储方式是指将变量存储在程序...

    详解C++中的const关键字及与C语言中const的区别

    当你只在定义该const常量的文件中使用该常量时,c++不给你的const常量分配空间–这也是c++的一种优化措施,没有必要浪费内存空间来存储一个常量,此时const int c = 0;相当于#define c 0;    当在当前文件之外...

Global site tag (gtag.js) - Google Analytics