首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

何时调用const运算符[],何时调用非const运算符[]?

当使用const修饰的对象或指针时,调用const运算符[];当使用非const修饰的对象或指针时,调用非const运算符[]。

const运算符[]用于访问对象或指针指向的数据,并且不会修改这些数据。它可以用于读取数据,但不能用于修改数据。当对象或指针被声明为const时,表示其值是只读的,不能被修改。

非const运算符[]用于访问对象或指针指向的数据,并且可以修改这些数据。它可以用于读取和修改数据。当对象或指针没有被声明为const时,表示其值是可读写的,可以被修改。

调用const运算符[]的场景包括:

  • 当需要读取对象或指针指向的数据,而不希望修改这些数据时。
  • 当对象或指针被声明为const时,必须使用const运算符[]。

调用非const运算符[]的场景包括:

  • 当需要读取和修改对象或指针指向的数据时。
  • 当对象或指针没有被声明为const时,可以使用非const运算符[]。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++中constconst对象分别调用constconst成员函数

一、先来提出问题 const对象可以调用const成员函数吗? const对象可以调用const成员函数吗? const成员函数内可以调用其它的const成员函数吗?...const成员函数内可以调用其他的const成员函数吗?...二、实践出真知 1、const对象可以调用const成员函数 2、const对象不能调用const成员函数 3、const对象可以调用const成员函数 4、const对象可以调用const成员函数...5、const成员函数不能调用const成员函数 6、const成员函数可以调用const成员函数 我们知道c++在类的成员函数中还会隐式传入一个指向当前对象的this指针,所以在test类中,...下面解释为什么const 对象可以调用const成员函数, 1 class test{ 2 public: 3 void print()const; 4 }; 前面我们把const成员函数print

1.3K20

运算符重载之何时重载为成员函数?何时重载为友元函数?

重载为成员函数: 一般情况下,当一元运算符的操作数,或者二元运算符的左操作数是该类的一个对象时 。...函数原型为:类名&类名::operator运算符(变量表) 例如:用重载函数实现字符串的连接(重载运算符“+”) 在这里插入代码片 #include “pch.h” #include #include...using namespace std; class S { public: S() { str = ‘\0’; len = 0; //调用构造函数给变量置初值 } S(const charpstr)...{ strcpy_s(str, pstr); len = strlen(pstr); //调用构造函数给变量赋值 } char*gets() { return str; //返回字符串 } int getLen...main() { S obj1(“Visual”), obj2(“C++”); //声明该类的对象同时调用相应的构造函数进行赋值 obj2 =obj1 + obj2; cout << “obj2.str

58430
  • CC++对bool operator < (const p &a)const的认识,运算符重载详解(杂谈)

    可以对两个node使用<操作符进行比较 return len<a.len; } }; 括号中的const表示参数a对象不会被修改,最后的const表明调用函数对象不会被修改!...运算符函数重载一般有两种形式:重载为类的成员函数和重载为类的非成员函数。非成员函数通常是友元。(可以把一个运算符作为一个非成员、友元函数重载。...调用成员函数运算符的格式如下:     .operator ()     它等价于          例如:a+b等价于a.operator +(...调用友元函数运算符的格式如下:     operator (,)     它等价于          例如:a+b等价于operator +(...下面具体讲讲重载运算符的一些具体用法吧! 1.一般运算符重载 在进行对象之间的运算时,程序会调用运算符相对应的函数进行处理,所以运算符重载有两种方式:成员函数和友元函数。

    2.2K61

    一.函数调用运算符

    一.函数调用运算符 一个函数 int func(int a){} func(5) 会发现无论里面有没有参数,都要用(),其实圆括号()就是函数调用的明显标记,()有一个称呼叫做函数调用运算符 如果在类中重载了函数调用运算符...对象(实参) 如何使用函数调用运算符呢?...但是如果前面没有类名,就像obj(2),这就不是初始化了,所以也不会调用构造函数,这就是调用对象obj的()圆括号 结论:只要这个对象所属的类重载了()“函数调用运算符”,那么这个类对象就变成了可调用的了...//第一个int是函数的返回类型 int operator()(int value) const { if(value < 0) cout <<...,函数也是) a)name函数 b)重载了函数调用运算符的Test类对象 把这些可调用对象的指针保存起来,目的是方便我们随时调用这些“可调用对象”,这些指针感觉像是我们C语言中的函数指针 int(*p)

    9310

    C++ 深入理解const_cast转换运算符

    const_cast转换运算符我们在RTTI和类型转换运算符中详细介绍过它的用法和使用场景,今天我们对其进一步了解一下。首先我们回忆一下它的作用和用法。...const_cast的基本使用 const_cast运算符用于执行只有一种用途的类型转化,即改变const或volatile。...在调用第三方函数中的使用 const_cast另外一种使用场景就是:在使用第三方库或API时,它们只提供了const类型的参数的函数,但我们只有const类型的对象。如示例2所示。...return 0; } 输出结果: 20 在示例2中,我们在使用第三方库和API的时候,我们只能调用,看不到其具体的实现,为了能够调用成功,需要使用const_cast来去除*ptr的const属性...总结 综上,我们使用const_cast的原则就是: 仅当实际引用的对象/变量不是常量,才使用const_cast; 当我们调用第三方库和一些API时,它们需要使用const形式的数据,但我们只有const

    77110

    【C++】类与对象(运算符重载、const成员、取地址重载)

    今日更新了类与对象运算符重载、const成员、取地址重载的内容 欢迎大家关注点赞收藏⭐️留言 赋值运算符重载 运算符重载 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数...赋值运算符重载 赋值运算符重载格式 参数类型:const T&,传递引用可以提高传参效率 返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值 检测是否自己给自己赋值 返回*this...,为了让前置++与后置++形成能正确重载 // C++规定:后置++重载时多增加一个int类型的参数,但调用函数时该参数不用传递,编译器自动传递 // 注意:后置++是先使用后+1,因此需要返回...= 1; return temp; } private: int _year; int _month; int _day; }; C++规定:后置++重载时多增加一个int类型的参数,但调用函数时该参数不用传递...总结 : 成员函数,如果是一个对成员变量只进行读访问的函数->建议加const,这样const对象和const对象都可以使用 成员函数,如果是一个对成员变量要进行读写访问的函数->不能加const

    13210

    【C++】运算符重载 ① ( 运算符重载简介 | 运算符重载推衍 | 普通类型数据相加 | 对象类型数据相加 - 普通函数实现 运算符重载实现 | 运算符重载调用 - 函数名调用 运算符调 )

    这是因为没有对 自定义类 的 " + " 运算符 , 进行 " 运算符重载 " , 直接使用加法操作 , 会报错 ; 这里就需要为 类 设置 " 运算符重载 " , 才能进行类的相加操作 , 具体相加的结果..., 需要通过 重载的运算符函数的操作决定 ; 2、运算符重载简介 运算符重载 , 可以使 用户自定义数据 , 以 更简洁的方式 运作 ; 运算符重载 是 C++ 语言中的 一种特殊的语言特性 , 运算符重载...addStudent(Student& s1, Student& s2) { Student s(s1.age + s2.age, s1.height + s2.height); return s; } 调用时....age, s1.height + s2.height); return s; } 使用 operator+ 调用运算符重载函数 operator+ 函数 , 可以直接使用 函数的方式调用 , //...s4 = operator+(s1, s2); 使用 + 运算符 调用运算符重载函数 直接使用 + 运算符调用 运算符重载函数 ; // 自定义类型相加 Student s1(10, 120),

    19420

    用null条件运算符调用事件处理程序

    有了null条件运算符之后,可以改用更为清晰的写法来实现: 这段代码采用null条件运算符(也就是?.)安全地调用事件处理程序。...该运算符首先判断其左侧的内容,如果发现这个值不是null,那就执行右侧的内容。反之,若为null,则跳过该语句,直接执行下一条语句。 从语义上来看,这与早前的if结构类似,但区别在于?....运算符左侧的内容只会计算一次。 由于C#语言不允许?.运算符右侧直接出现一对括号,因此,必须用Invoke方法去触发事件。...每定义一种委托或事件,编译器就会为此生成类型安全的Invoke()方法,这意味着,通过调用Invoke方法来触发事件,其效果与早前那种写法是完全相同的。

    46110

    使用null条件运算符调用事件处理程序

    对于刚接触事件处理的开发人员来说,会觉得触发事件是一个非常容易的事情,只需要把事件定义好在触发的时候调用相关事件就可以了。...如果存在多个线程都要检测并调用同一个事件,这些线程之间又存在争夺的问题,会出现什么情况? 针对上面这两个问题,在 C# 6.0 中新增的 null 条件运算符就可以解决这个问题。...在 C#6.0 以后我们就可以使用 null 条件运算符来简单的处理这个问题,下面我们来看一下在 C#6.0 中如何解决这个问题。...Invoke(this.count); } } 这段代码采用了 null 条件运算符安全的调用了事件处理程序,它首先会判断 ?...这种方式的优势在于和以前使用 if 的方式相比,运算符左侧的内容只会计算一次。但是这里又有需要注意的地方,因为 C# 不允许在 ?.

    60820

    指针详解(const、指针运算、数组名的理解、传址调用和传值调用、一维数组的本质​)(一)

    一、const修饰指针 const修饰指针 const(常量,不变) 问:被const是否修饰的变量是否有其他方法修改值?...3.arr[i]中的[]是索引运算符,用于访问数组中的元素。它表示将数组名arr解析为指向数组首元素的指针,并使用索引i进行偏移,以访问数组中第i个元素的值。...arr) / sizeof(arr[0]);//获取数组中的元素个数 //test(arr);//这里的数组名就是数组首元素地址 Print(arr,sz); return 0; } 六、传址调用和传值调用...传值调用:传的是变量,传值调用 int Add(int x, int y) { return x + y; } int main() { int a = 10; int b = 20;...int ret = Add(a, b); //调用函数 printf("%d\n", ret); return 0; } 传值调用:传的是地址 6.1模拟strlen函数 int my_strlen

    17010

    指针*和引用&的区别使用

    引用& 首先,&不是地址运算符,而是类型标识符的一种,就像*也不是指针运算符一样。 本篇偏向于&运算符。...&:可以叫它引用运算符 *:可以叫它解除指针运算符 就像char *意为指向char的指针一样,int&意为指向int 的引用。...按引用传递允许被调用函数能够访问调用函数中的变量。这是C++相比C的一个超越。...将引用参数声明为const数据的好处有这些: 防止无意中被修改。 使用const参数可以兼容const传参。 将引用用于结构 C++引入引用主要就是为了和结构和类。...下面是一个反面教材: Str& test(const Str &d) { Str &e; ··· return e; } 何时使用引用参数? 程序员能够修改调用函数中的数据对象。

    1.1K50

    EasyC++71,拷贝构造函数

    这些成员函数有: 默认构造函数 默认析构函数 拷贝构造函数 赋值运算符 地址运算符 编译器将会生成最后三个函数的定义——拷贝构造函数、赋值运算符和地址运算符。...比如当我们把一个对象赋值给另外一个对象的时候,编译器就会调用默认的赋值运算符,完成对象赋值工作。地址运算符返回调用对象的地址,也就是取地址的时候返回结果。...拷贝构造函数的原型通常如下: Class_name(const Class_name &); 它接受一个指向类对象的常量引用作为参数。 对于拷贝构造函数我们只需要知道两点:何时调用和有何功能。...何时调用 新建一个对象并且初始化的时候,拷贝构造函数都会被调用。...默认的拷贝构造函数 默认的拷贝构造函数逐个赋值静态成员,复制的是成员的值。

    23820

    C++类和对象(中)

    //非法,此时需要通过运算符重载解决这个问题 //解决方法如下 const Date operator-(const Date& d) { //简单演示,逻辑存在问题,可以忽略 Date tmp...,我们可以干很多事情,比如直接通过 [] 访问类中的成员,实现两个对象的快速运算等操作 ️使用注意 operator 虽然很好,但也有很多使用规则: operator 操作符就是函数名 不能与操作符链接...: 三目运算符 . 访问成员符 为何运算符能实现重载?...此时重载的运算符是 = 赋值重载的目的:将 d1 对象赋值给 d2,拷贝构造,d1、d2均已存在 class Date { public: //赋值重载函数 Date& operator=(const...、何时用我们自己写的,都是有讲究的,部分成员函数规则多、实现麻烦,需要多加练习以加深理解。

    21410

    C++:10---再议拷贝构造函数

    但现在,我们只需了解拷贝初始化何时发生,以及拷贝初始化是依靠拷贝构造函数或移动构造函数来完成的就可以了 七、拷贝构造出现的情景 拷贝初始化不仅在我们使用=定义变量时会发生,在下列情况下也会发生: ●将一个对象作为实参传递给...- -个引用类型的形参 ●从一个返回类型为引用类型的函数返回一个对象 ●用花括号列表初始化-一个数组中的元素或--个聚合类中的成员 八、使用=default 与构造函数使用=default一样,拷贝构造函数也可以使用...例如: class A; A a; A b = a; // 调用拷贝构造函数, 因为b是第一次初始化 A c(a); // 调用拷贝构造函数, 因为c是第一次初始化 b = c;...// 调用赋值运算符, 因为b已经初始化过了 十一、需要析构函数的类也需要拷贝和赋值操作 原则:通常,如果一个类需要一个析构函数,我们几乎可以肯定这个类也需要一个拷贝构造函数和一个拷贝赋值运算符...反之亦然一如果一个类需要一个拷贝赋值运算符,几乎可以肯定它也需要一个拷贝构造函数。然而,无论是需要拷贝构造函数还是需要拷贝赋值运算符都不必然意味着也需要析构函数。

    71320

    JavaScript ES12新特性抢先体验

    like','love') console.log(replaceAllStr) // 'I love 前端,I love 前端公虾米' 需要注意的是,replaceAll在使用正则表达式的时候,如果全局匹配...对对象的弱引用是不会阻止垃圾收集器GC恢复该对象的引用,则GC可以在任何时候删除它。...逻辑运算符和赋值表达式 逻辑运算符和赋值表达式,新特性结合了逻辑运算符(&&,||,??)...和赋值表达式而JavaScript已存在的 复合赋值运算符有: 操作运算符:+= -= *= /= %= **= 位操作运算符:&= ^= |= 按位运算符:>...= >>>= 现有的的运算符,其工作方式都可以如此来理解 表达式:a op= b 等同于:a = a op b 逻辑运算符和其他的复合赋值运算符工作方式不同 表达式:a op= b 等同于:a =

    34130

    【C#学习笔记之一】C#中的关键字

    不可被实例化,用途是派生出其他抽象类.当从抽象类派生抽象类时,这些抽象类必须具体实现所继承的所有抽象成员,从而重写那些抽象成员(对抽象方法的重写必用override,虚方法的关键字virtual,...new New 运算符:用于创建对象和调用构造函数。 New 修饰符:用于向基类成员隐藏继承成员。...不可被实例化,用途是派生出其他抽象类.当从抽象类派生抽象类时,这些抽象类必须具体实现所继承的所有抽象成员,从而重写那些抽象成员(对抽象方法的重写必用override,虚方法的关键字virtual,...const 指定无法修改字段或局部变量的值。声明常量的关键字 event 声明事件。...new New 运算符:用于创建对象和调用构造函数。 New 修饰符:用于向基类成员隐藏继承成员。

    2.4K50

    JavaScript ES12新特性抢先体验

    like','love') console.log(replaceAllStr) // 'I love 前端,I love 前端公虾米' 需要注意的是,replaceAll在使用正则表达式的时候,如果全局匹配...对对象的弱引用是不会阻止垃圾收集器GC恢复该对象的引用,则GC可以在任何时候删除它。...逻辑运算符和赋值表达式 逻辑运算符和赋值表达式,新特性结合了逻辑运算符(&&,||,??)...和赋值表达式而JavaScript已存在的 复合赋值运算符有: 操作运算符:+= -= *= /= %= **= 位操作运算符:&= ^= |= 按位运算符:>...= >>>= 现有的的运算符,其工作方式都可以如此来理解 表达式:a op= b 等同于:a = a op b 逻辑运算符和其他的复合赋值运算符工作方式不同 表达式:a op= b 等同于:a =

    58531

    完全搞懂 Javascript 中的...

    曾几何时,ES6/ES2015 对 Javascript 语言进行了重大升级。它引入了许多不同的新功能。其中之一就是我们可以用在任何兼容容器(对象、数组、字符串、集合、映射)前面的三个连续点。...三个连续的点具有两个含义:展开运算符(spread operator)和剩余运算符(rest operator)。 展开运算符 展开运算符允许迭代器在接收器内部分别展开或扩展。...你可以用索引来访问它,但是不能调用像 map、filter 这样的数组方法。参数是一个可迭代的对象,那么我们做些什么呢?在它们前面放三个点,然后作为数组去访问!...你可以用展开运算符把字符串拆分为字符。当然,如果你用空字符串调用 split 方法也是一样的。...无论用哪种方式,你现在就可以把展开运算符和剩余参数用到自己的代码中。

    68520
    领券