首页 > 编程语言 >C++ | const的使用

C++ | const的使用

时间:2023-07-31 18:46:25浏览次数:38  
标签:const 指向 int demo sum C++ 使用 指针

const

  • 基础用法

    用于声明一个不可再被修改的变量:

    const int num = 17;
    num = 33;				// Invalid,会报错
    
  • 用于指针

    首先,如果将一个指针用const声明为常量指针,那么这个指针的指向将不能被改变。但可以通过这个指针来修改被指向的对象:

    int demo = 17;
    int* const p = &demo;	// 这是一个指向非常量对象的常量指针
    p++;					// Invalid
    *p = 33;				// Valid
    

    区别于下面这种情况:一个指向const int类型变量的指针。

    这种情况下,p的指向可以被改变,但无法通过p来改变demo的值。

    const int *p = &demo;	// 这是一个指向常量对象的非常量指针
    p++; 		 			// Valid
    *p = 32;				// Invalid
    

    从上面可以看出,指向const int类型的指针也可以用来指向int类型的变量,即被指向的变量不需要用const声明。

    而当想要用指针指向一个常量对象时,指针也必须得是用const声明(此时指针指向一个常量对象,但本身不需要是一个常量指针)。其原因是:如果demoq指针指向,那么便可以通过q指针修改demo,这样将demo定义为常量对象就毫无意义了。

    const int demo = 13;
    const int *p = &demo;	// Valid
    int *q = &demo;			// Invalid,可以通过以下代码修改demo的值:
    *q = 17;				// 当然,这行代码无法通过编译器
    
  • 用于函数

    • 用于参数

      首先,如果想要传入一个const类型的实参,那么形参必须也得是const类型:

      int sum(int arr[], int num){}
      const int a[10] = {...};
      sum(a, num);					// Invalid
      

      因此,当不需要在函数中修改参数时,最好使用const定义形参。这样既可接受const类型的实参,也可接受非const类型的实参。否则,只能接受非const类型实参:

      const int a[10];
      int b[10];
      
      int sum(int arr[]);
      sum(a);						// Invalid
      sum(b);						// Valid,在这种方法下,数组b可以被修改
      
      int sum(const int arr[]);
      sum(a);						// Valid
      sum(b);						// Valid,在这种方法下,数组b不可以被修改
      
    • 用于整个函数

      在函数声明后面跟上 const 关键字,表明这个函数不会修改当前对象(用于成员函数)。

      class tmp{
          void show() const;
      };
      void tmp::show() const{}
      

标签:const,指向,int,demo,sum,C++,使用,指针
From: https://www.cnblogs.com/C111111/p/17594195.html

相关文章

  • C++ | 引用
    引用&使用引用intb=33,&a=b;b=17;cout<<a;//打印a为17使用引用声明变量类似于指针,声明的变量会同被引用的变量绑定,修改任何一方的数据都会使另一方的数据也改变。使用上的区别在于使用引用不需要*,引用可以理解为一个别名。在函数中使用引用传递参数将参......
  • C++ | 运算符重载
    运算符重载在类中的函数进行重载(成员函数)运算符重载用于重新定义运算符的作用,使用函数名称operatorOP作为函数名,其中OP为具体的运算符(如operator+)classTime{Timeoperator+(constTime&t);};Timea,b;Timec=a+b;在成员函数中重载的运算符,如+-等,默认左边......
  • Mybatis中的Mapper.xml映射文件sql查询接收多个参数 分页查询 sql语句动态生成的时候,
    Mybatis中的Mapper.xml映射文件sql查询接收多个参数分页查询sql语句动态生成的时候,使用${},sql语句中某个参数进行占位的时候用#{}原文链接:https://blog.csdn.net/Ep_Little_prince/article/details/100687848​我们都知道,在Mybatis中的Mapper.xml映射文件可以定制动态SQ......
  • C++初始化列表时,形参和实参名可以一样,编译器可以识别
    在这里初始化列表直接用age(age)即可,用this->age(age)反而会出错,C++不允许在成员初始化列表中使用this关键字来初始化类成员classPerson{public:Person(intage):age(age){}//Initializethe'age'memberdirectlyinthememberinitializerlistinta......
  • 软件测试|教你如何使用UPDATE修改数据
    简介在SQL(StructuredQueryLanguage)中,UPDATE语句用于修改数据库表中的数据。通过UPDATE语句,我们可以更新表中的特定记录或多条记录,从而实现数据的修改和更新。本文将详细介绍SQLUPDATE语句的语法、用法以及一些注意事项。UPDATE语句SQL是一种用于管理和操作关系型数据库的语言,其......
  • 软件测试|SQL TOP提取顶部数据该如何使用?
    SQLTOP子句:提取数据库中的顶部数据简介在SQL查询语言中,TOP子句是一个非常有用的功能,它允许我们从数据库中提取指定数量的顶部数据记录。本文将深入探讨SQLTOP子句的使用方法,以及在实际应用中的一些常见场景和技巧。SQLTOPSQL是一种用于管理和操作关系型数据库的强大语言,TOP子句......
  • 使用powershell找回丢失的RDCManager密码
    内网的一台服务器上的装机默认用户密码忘记了,但是好在别的电脑上使用RDCMan(RemoteDesktopConnectionManager)连接过这台服务器,并且保存了密码。于是经过一番折腾,最后把密码找回来了:  最后成功的powershell脚本来自于这个地址:https://www.undocumented-features.com/2019/......
  • Android Fragments 详细使用
    AndroidFragments详细使用 Fragments诞生初衷  自从Android3.0中引入fragments的概念,根据词海的翻译可以译为:碎片、片段。其上的是为了解决不同屏幕分辩率的动态和灵活UI设计。大屏幕如平板小屏幕如手机,平板电脑的设计使得其有更多的空间来放更多的UI组件,而多出......
  • 在python文件操作中使用writelines()函数却报write()函数使用错误
    代码是这样的:1deffunc1():2file=open("test.txt","a+",encoding="utf-8")3list1=[("20","10")]4list2=[{"name":"Tom","age":20}]5file.writelines(li......
  • UVM:6.4.4 p_sequencer 的使用
    1.考虑如下情况,sequencer有如下变量:2.在sequence发送transaction时,必须设置此dmac和smac,sequence的body如何得到这两个值呢?1)在介绍sequence时,内部有m_sequencer,直接使用m_sequencer得到这两个变量:编译错误:因为m_sequencer是uvm_sequencr_base(uvm_sequencr的基类)类型,而不......