C/C++中CONST用法总结(推荐)

1、修饰常量时:

const int temp1; //temp1为常量,不可变
  int const temp2; //temp2为常量,不可变

2、修饰指针时:

  主要看const在*的前后,在前则指针指向的内容为常量,在后则指针本身为常量;

const int *ptr;  //*ptr为常量;
  int const *ptr;  //*ptr为常量;
  int* const ptr;  //ptr为常量;
  const int * const ptr;  //*ptr、ptr均为常量;

3、const修饰类对象时:

  const修饰类对象时,其对象中的任何成员都不能被修改。const修饰的对象,该对象的任何非const成员函数都不能调用该对象,因为任何非const成员函数都会有修改成员变量的可能。

class TEMP{
    void func1();
    void func2() const;
  }
  const TEMP temp;
  temp.func1(); //错误;
  temp.func2(); //正确;

4、const修饰成员变量:

  const修饰的成员变量不能被修改,同时只能在初始化列表中被初始化,因为常量只能被初始化,不能被赋值;

  赋值是使用新值覆盖旧值构造函数是先为其开辟空间然后为其赋值,不是初始化;而初始化列表开辟空间和初始化是同时完成的,直接给与一个值,所以const成员变量一定要在初始化列表中完成。

class TEMP{
    const int val;
    TEMP(int x)val(x){};  //只能在初始化列表中赋值;
  }

5、const修饰类的成员函数

  const成员函数表示该成员函数不能修改类对象中的任何非const成员变量。一般const写在函数的后面,形如:void func() const;

  如果某个成员函数不会修改成员变量,那么最好将其声明为const,因为const成员函数不会对数据进行修改,如果修改,编译器将会报错;

class TEMP{
    void func()const; //常成员函数,不能修改对象中的成员变量,也不能调用类中任何非const成员函数;
  }

  对于const类对象,只能调用类中的const成员函数,所以const修饰成员函数的作用主要就是限制对const对象的使用。

6、const在函数声明中的使用:

  在函数声明中,const可以修饰函数的返回值,也可以修饰具体某一个形参;

  修饰形参时,用相应的变量初始化const常量,在函数体内,按照const所修饰的部分进行常量化;

  修饰函数返回值时,一般情况下,const修饰返回值多用于操作符的重载。通常不建议用const修饰函数的返回值类型为某个对象或某个对象引用的情况;

7、const常量与define宏定义的区别:

  1)处理阶段不同:

  define是在预处理阶段,define常量从未被编译器看见,因为在预处理截断就已经替换了;

  const常量在编译阶段使用。

  2)类型和安全检查不同

  define没有类型,不做任何检查,仅仅是字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误

  const常量有明确的类型,在编译阶段会进行类型检查;

  3)存储方式不同

  define是字符替换,有多少地方使用,就会替换多少次,不会分配内存;

  编译器通常不会为const常量分配空间,只是将它们保存在符号表内,使他们成为一个编译期间的一个常量,没有读取内存的操作,效率也很高;

8、mutable关键字:

  在C++中,mutable是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中,甚至结构体变量或者类对象为const,其mutable成员也可以被修改:

class ST {
    public:
    int a;
    mutable int showCount;
    void Show()const;
  };
  void ST::Show()const{
    //a=1;//错误,不能在const成员函数中修改普通变量
    showCount++;//正确
  }

  mutable只能修饰非静态数据成员;

9、const_cast:

  用于修改类型的const或volatile属性。

  用法:

:const_cast<type_id> (expression)

  该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。

  1)常量指针被转化成非常量的指针,并且仍然指向原来的对象;

  2)常量引用被转换成非常量的引用,并且仍然指向原来的对象;

  3)const_cast一般用于修改底指针。如const char *p形式。
 
建议:

  1、应该尽可能使用const,它会允许你指定一个语义约束(也就是指定一个不能被改动的对象),而编译器会强制实施这项约束。它允许你告诉编译器和其他程序员某值应该保持不变。

  2、将某些东西声明为const可帮助编译器侦测出错误用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体;

  3、编译器强制实施bitwise constness,但你编写程序时应该使用“概念上的常量性”(conceptual constness);

  4、当const和non_const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复;

以上所述是小编给大家介绍的C/C++中CONST用法总结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • 浅析c++ 中const关键字

    const是一个C++语言的限定符,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性.另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助. define与const的区别 1.define作用在预处理时,是简单地字符替换 2. const作用在编译时,具有类型检查的功能 3. const必须进行初始化 常量指针与指针常量 #include <iostream> using std::endl; using std::cout

  • C++ 中 const和static readonly区别

    C++ 中 const和static readonly区别 我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等. 在多数情况下可以混用. 二者本质的区别在于,const的值是在编译期间确定的,因此只能在声明时通过常量表达式指定其值.而static readonly是在运行时计算出其值的,所以还可以通过静态构造函数来赋值. 明白了这个本质区别,我们就不难看出下面的语句中static readonly和const能否互换了: 1. stat

  • 浅析C++的引用与const指针与各种传递方式

    浅析C++的引用与const指针与各种传递方式 首先我们知道 const int *p 与 int const *p 是一样的,即 *p 是常量:而 int * const p 跟上面是不一样的,即 p 是常量:我们知道引用只是一个别名,与变量共享存储空间,并且必须在定义的时候初始化,而且不能再成为别的变量的别名,这让我们想到什么呢,貌似跟  int * const p   的性质很像. 其实引用的底层就是用const指针来实现的.下面举个小例子: #include <iostream> us

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

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

  • C++ 中const对象与const成员函数的实例详解

    C++ 中const对象与const成员函数的实例详解 const对象只能调用const成员函数: #include<iostream> using namespace std; class A { public: void fun()const { cout<<"const 成员函数!"<<endl; } void fun() { cout<<"非const成员函数 !"<<endl; } }; int

  • C++ 中const修饰虚函数实例详解

    C++ 中const修饰虚函数实例详解 [1]程序1 #include <iostream> using namespace std; class Base { public: virtual void print() const = 0; }; class Test : public Base { public: void print(); }; void Test::print() { cout << "Test::print()" << end

  • C++ const引用、临时变量 引用参数详解

    C++引用-临时变量.引用参数和const引用 如果实参与引用参数不匹配,C++将生成临时变量.如果引用参数是const,则编译器在下面两种情况下生成临时变量: 实参类型是正确的,但不是左值 实参类型不正确,但可以转换为正确的类型 左值参数是可被引用的数据对象,例如,变量.数组元素.结构成员.引用和被解除引用的指针都是左值,非左值包括字面常量和包含多项式的表达式.定义一个函数 Double refcube(const double& ra) { Returnra*ra*ra; } double

  • C++中的const的使用详解

     C++中的const的使用详解 const在c/c++中还是会经常出现的,并且如果不理解const会在编程出现的错误而不知所措,无法理解.下面从几个角度简要理解const的内容,应该还是蛮有用的. const与指针类型 const int*p = NULL; 和int const*p = NULL;是等价的.因为const都在" * "的前面,其实是以*为标志的. 1. int x = 3; const int *p = &x; // p = &y;正确 , //*p

  • C/C++中CONST用法总结(推荐)

    1.修饰常量时: const int temp1; //temp1为常量,不可变 int const temp2; //temp2为常量,不可变 2.修饰指针时: 主要看const在*的前后,在前则指针指向的内容为常量,在后则指针本身为常量: const int *ptr; //*ptr为常量: int const *ptr; //*ptr为常量: int* const ptr; //ptr为常量: const int * const ptr; //*ptr.ptr均为常量: 3.const修饰

  • C#中const用法详解

    本文实例讲述了C#中const用法.分享给大家供大家参考.具体用法分析如下: const是一个c语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助.另外const在其他编程语言中也有出现,如c++.php5.c#.net.hc08 c const 一般修饰 的变量为只读变量 const定义应该为在定义的时候初始化 以后不能改变他的值 例: 复制代码 代码如下: c

  • C++中const用法小结

    const在C++中使用十分广泛,不同位置使用的意义也不尽相同,所以想写篇文章对其做一个总结. 首先,明确const是"不变"这个基本意义,但是不变不意味着什么都不变,下面将会看到. 1. const与变量 基本原则:const变量(对象)不能被修改 const在变量中的引入和魔数有关,所谓"魔数"指的是突然出现的一个常量值(也叫字面值常量). for(int i = 0; i < 512; i++) { // todo } 上例中,512即为魔数,512突然

  • C#中const 和 readonly 修饰符的用法详解

    1. 只有C#内置类型(int,double,long等)可以声明为const;结果.类和数组不能声明为const. 2. readonly 是在字段上使用的修饰符,直接以类名.字段访问. 3. const 必须在申明中初始化.之后不能再修改. 4. readonly可以在申明中初始化,也可以在构造函数中初始化,其它情况不能修改. namespace const_and_readonly { class Program { static void Main(string[] args) { Co

  • 详解微信小程序中var、let、const用法与区别

    微信小程序可以使用Javascript的最新ES6标准来开发所以微信小程序中var.let.const用法与区别可以视为Javascript ES6标准中var.let.const用法与区别 let命令 基本用法 ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a = 10; var b = 1; } a // ReferenceError: a is not defined. b // 1 上面代码在代码块之中,分

  • C/C++ 中const关键字的用法小结

    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性. Const作用 NO. 作用 说明 参考 1 可以定义const常量 const int Max = 100; 2 便于进行类型检查 const常量有数据类型,而宏常量没有数据类型.编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误 void f(const int i) { ---} //对传入的参数进行类型检查,不匹配进行提示 3 可以保护被修

  • C语言与C++中const的用法对比

    目录 一.C语言中的const 二.C++中的const 三.进一步比较C和C++中的const 四.const与宏的区别 五.小结 一.C语言中的const const修饰的变量是只读的,本质还是变量 const 修饰的局部变量在栈上分配空间 const修饰的全局变量在只读存储区分配空间 const只在编译期有用,在运行期无用 C语言中的const使得变量具有只读属性 const将具有全局生命周期的变量存储于只读存储区 const修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号

  • 浅谈C++中const与constexpr的区别

    目录 一.const常量与#define比较 二.const修饰 1.修饰普通变量,必须初始化 2.修饰类变量和成员变量 3.修饰成员函数 4.修饰指针 5.修饰引用 三.const转换 四.顶层const与底层const 五.C++11新引入的constexpr 一.const常量与#define比较 define只是简单的替换,没有类型,const可以做到防窜改与类型安全. 而且#define会在内存中可能(有几次替换就有几次拷贝)有多份拷贝,对于字面值常量加不加const都一样,例如:co

  • AngularJS中ng-class用法实例分析

    本文实例讲述了AngularJS中ng-class用法.分享给大家供大家参考,具体如下: 使用 ng-class 动态设置元素的类,方法是绑定一个代表所有需要添加的类的表达式.重复的类不会添加.当表达式发生变化,先前添加的类会被移除,新类会被添加. 在angular中为我们提供了3种方案: ① 通过数据的双向绑定(不推荐使用) ② 通过对象数组. ③ 通过key/value 一.通过数据双向绑定: function changeClass(){ $scope.className = "chang

随机推荐