首页
学习
活动
专区
圈层
工具
发布

C++中const和非const对象分别调用const和非const成员函数

一、先来提出问题 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类中,...* this; 是和void print() const;中this指针的类型是一样的,所以常量对象可以调用const成员函数。

1.8K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++从入门到精通——const与取地址重载

    前言 类的6个默认成员函数:如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。...默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。 class Date {}; 一、const 正常用法 在C++中,可以使用const关键字来声明一个常量成员。...在C++中,一个对象如果被声明为const,则表示该对象是只读的,其成员变量不能被修改。因此,一个const对象只能调用其成员函数中被声明为const的成员函数。...如果一个成员函数没有被声明为const,则它默认是一个非const成员函数。非const成员函数可以修改对象的成员变量,因此不能被const对象调用。...const成员函数内可以调用其它的非const成员函数吗 在const成员函数内部,只能调用其他const成员函数。

    30510

    【C++】剖析static关键字&&友元

    explicit,在C++中主要是用于修饰只有一个参数的类的构造函数,它的作用是表明该构造函数是显示的, 当然有显示的,肯定就有隐性的用来对应:关键词implicit 特性: C++支持内置类型隐式类型转换为类类型对象...static啦~ 关键字static: 关键字static是什么: static是C/C++中的一个关键字,可以在函数和变量上使用(也就是他们的修饰符),主要作用是控制变量的存储方式和作用范围,被放在静态区中...静态成员函数中可以访问其他的静态成员,但是不能访问非静态的,因为没有this指针。 非静态的成员函数,可以访问任意的静态成员变量和静态成员函数。...(在“A”类中声明) //cout << A::_scount << endl; return 0; } 运行代码: 当静态成员变量变成私有时,有三种方法可以采用: 通过对象.静态成员函数来访问 通过类名...友元函数可以在类定义的任何地⽅声明,不受类访问限定符限制。 ⼀个函数可以是多个类的友元函数。 友元类中的成员函数都可以是另⼀个类的友元函数,都可以访问另⼀个类中的私有和保护成员。

    14510

    【C++】‘类与对象‘-三部曲——(5)(33)

    ”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this 指针,表明在该成员函数中不能对类的任何成员进行修改 图示: 一.用const修饰this指针的好处——...答案:不是的,要修改成员变量的函数不能加。 三.几个的使用场景 请思考下面的几个问题: 1. const对象可以调用非const成员函数吗?no 2....非const对象可以调用const成员函数吗?yes 3. const成员函数内可以调用其它的非const成员函数吗?no 4. 非const成员函数内可以调用其它的const成员函数吗?...no(无this指针) 非静态成员函数可以调用类的静态成员函数吗?..."实现一个类,计算程序中创建出了多少个类对象" 原理: 定义一个静态成员变量_scount,再在类中声明一个访问静态成员变量的静态成员函数GetACount(); 构造++_scount,析构-

    18510

    【C++基础篇】学习C++就看这篇--->类和对象之static成员、友元、内部类、匿名对象

    静态成员函数可以调用非静态成员函数吗? 2. 非静态成员函数可以调用类的静态成员函数吗? 答: 1....显然是不可以的,静态成员函数是没有this指针的,要调用非静态成员函数必须将对象地址传给非静态成员函数(这一步是隐藏的) 2. 显然是可以的,无需解释。...友元分为:友元函数和友元类 ✨2.1 友元函数 背景: 如上面Time类的几个成员变量是在私有限定符下 这就导致了在类外面是不能访问的,但是如果我必须要访问怎么办?..._second ; return in; } 注意: 友元函数可访问类的私有和保护成员,但不是类的成员函数 友元函数不能用const修饰 友元函数可以在类定义的任何地方声明,不受类访问限定符限制...一个函数可以是多个类的友元函数 友元函数的调用与普通函数的调用原理相同 总结一下: 友元函数在 C++ 中的主要应用场景是当某个函数需要直接访问一个类的私有或保护成员,但该函数逻辑上又不应该

    10910

    【C++】深入探索类和对象:初始化列表及其static成员与友元

    虽然大部分成员变量可以在函数体中赋值,但是函数体可以对于成员多次赋值,不好控制。...,必须放在初始化列表位置进行初始化 引用成员变量 const成员变量 自定义类型成员(且该类有显示构造函数时) 其他成员,可以在初始化列表,也可以在函数体内;但是建议在初始化处理 class A { public...静态成员函数没有隐藏的this指针,不能访问任何非静态成员 静态成员也是类的成员,受public,protected,private访问限定符的限制 问题: 静态成员函数可以调用非静态成员函数吗?...非静态成员函数可以调用类的静态成员函数吗? 答: 静态成员函数可以调用非静态成员函数,但是需要通过对象或者指针来调用非静态成员函数。...: 友元函数可访问类的私有和保护成员,但不是类的成员函数 友元函数尽量不用**const**修饰 友元函数可以在类定义的任何地址声明,不受类访问限定符限制 一个函数可以是多个类的友元函数 友元函数的调用与普通函数的原理相同

    23010

    const的正确姿势:从变量、函数到成员函数

    Bitwise constness(物理常量性):编译器强制执行的标准:一个 const 成员函数只有在不修改对象的任何非静态成员变量(bit)时,才是 bitwise const 的。...任何被声明为 mutable 的成员变量都可以在 const 成员函数中被修改。...避免 const 和非 const 成员函数的代码重复(Effective C++ 条款 3) 也提到了一个常见问题:const 和 非 const 版本的 operator[] 几乎做同样的事情,代码重复...注意:反向操作(在 const 版本中调用非 const 版本)是错误且危险的,因为这违背了 const 成员函数不修改对象的承诺。...const 成员函数是承诺:将不修改对象 observable state 的成员函数声明为 const。这使你的类可以与 const 对象一起工作。

    8810

    【C++干货基地】面向对象核心概念 const成员函数 | 初始化列表 | explicit关键字 | 取地址重载

    不能 const 对象调用非const成员会导致,权限的放大所以会出现错误 非const对象可以调用const成员函数吗?...可以 非const 成员调用 const 成员函数属于权限的缩小,权限是可以缩小的 const成员函数内可以调用其它的非const成员函数吗?...不可以,这样会导致权限的放大 非const成员函数内可以调用其它的const成员函数吗? 可以,非const 成员,调用const 成员是权限的缩小 总结 1....所以构造函数并不是初始化成员变量的地方,而我们在进行类声明的时候给的的默认值夜也只是声明 3.2 初始化列表 在C++中规定了所有成员变量在初始化的时候都是在初始化列表进行初始化的 初始化列表:以一个冒号开始...这个我相信很好了解,初始化列表不管我们写没写都会在初始化列表进行初始化 所以对于简单的变量初始化建议使用初始化列表 一些复杂的类初始化可以使用在构造函数体内进行初始化 规则二 成员变量在类中声明次序就是其在初始化列表中的初始化顺序

    15800

    类和对象(2)

    Date d3(); } 5 如果类中没有显式定义构造函数,那么在c++中编译器会自动生成一个无参的默认构造函数,用户如果显式定义,则编译器不再自动生成。...请思考下面的几个问题: 1. const对象可以调用非const成员函数吗?...编译器会阻止这种调用,以确保 const 对象的不可变性。 2. 非const对象可以调用const成员函数吗? 答案是肯定的。非 const 对象当然可以调用 const 成员函数。...这提供了一种方式来提供对对象状态的只读访问,同时仍然允许非 const 对象进行其他可能的修改。 3. const成员函数内可以调用其它的非const成员函数吗? 答案是否定的。...非const成员函数内可以调用其它的const成员函数吗?   答案是肯定的。非 const 成员函数内部可以自由地调用 const 成员函数。

    18810

    【C++从小白到大牛】类和对象

    1、类名就是类型,Stack就是类型,不需要加struct(在C语言中类型还要加上struct) 2、 C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。...可以直接将函数定义在类的内部,如果一个工程中定义多个数据结构,我们只需要将类进行实例化,不需要担心不同数据结构的函数回命名冲突。...类声明放在.h文件中,成员函数定义放在.cpp文件中 注意:成员函数名前需要加类名:: 标准正确定义的方法: 长的函数声明和定义分离;短小的函数可以直接在类里面定义 成员变量命名规则的建议: // 我们看看这个函数...C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问...问题: 1、静态成员函数能调用非静态成员函数吗? 答:不可以,因为静态成员函数没有this指针,同样也不能访问非静态成员变量 2、非静态成员函数能调用静态成员函数吗?

    23210

    【C++篇】类与对象(下篇):深入解析初始化列表、静态成员、友元与内部类的高级实践

    (我的VS2022不做处理) 自定义类型成员会调用这个成员类型的默认构造函数,如果没有默认构造会编译错误 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关 我们来做一个选择题...访问限定符的限制 问题1:静态成员函数可以调用非静态成员函数吗?...可以,因为静态成员为所有类对象所共享(特性1) 问题2:非静态成员函数可以调用类的静态成员函数吗?...,但不是类的成员函数 友元函数不能用const修饰 友元函数可以定义在类定义的任何地方声明,不受访问限定符限制 一个函数可以是多个类的友元函数 友元函数的调用与普通函数的调用原理相同 2....(内部类对于外部类来说只是一个声明,并没有去开辟存储空间) 类和对象的内容就结束啦。如果我的文章对你有帮助,欢迎订阅我的C++的专栏,永不收费。

    20610

    【C++基础篇】学习C++就看这篇--->类和对象之const成员、取地址及const取地址操作符重载、初始化列表、explicit关键字

    支持返回不同类型的引用 根据对象常量性提供不同实现(如返回 const/non-const 引用) 思考下面的几个问题: 1️⃣ const对象可以调用非const成员函数吗?...2️⃣ 非const对象可以调用const成员函数吗? 3️⃣ const成员函数内可以调用其它的非const成员函数吗?...4️⃣ 非const成员函数内可以调用其它的const成员函数吗?...2️⃣ 显然是可以的,非const对象是可读可写的,那调用一个只读的成员函数,当然可行。 3️⃣ 显然是不可以的,上述已经给了例子,仍然是只读的给了可读可写的。...//成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后 //次序无关 } 这在上面的内容中也提到了,成员变量初始化是根据声明顺序进行的。

    10810

    【细品C++】深入了解类和对象(六大默认成员函数以及操作符重载)

    类的6个默认成员函数 在上一篇文章中,我提到过空类,也就是什么成员都没有的类。 但事实上,空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。...注意:C++11中针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量在类中声明时可以给默认值。 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。...非const对象可以调用const成员函数吗? 注释掉上面代码中的非const修饰的Print函数,编译运行正常。...const成员函数内可以调用其它非const成员函数吗?...非const成员函数内可以调用其它的const成员函数吗? 编译运行通过,运行截图: 与第二个问题类似,非const可以传给const,权限可以缩小。

    1K20

    【C++系列(合集)】特性多又复杂?不存在!——这篇C++大全直接干碎(超级大全,精讲)

    答案:不是的,要修改成员变量的函数不能加。 三.几个的使用场景 请思考下面的几个问题: 1. const对象可以调用非const成员函数吗?no 2....非const对象可以调用const成员函数吗?yes 3. const成员函数内可以调用其它的非const成员函数吗?no 4. 非const成员函数内可以调用其它的const成员函数吗?...访问限定符的限制 三.静态成员函数和非静态成员函数的调用关系 请思考下面的几个问题: 静态成员函数可以调用非静态成员函数吗?...no(无this指针) 非静态成员函数可以调用类的静态成员函数吗?...关键字 说明: 友元函数可访问类的私有和保护成员,但不是类的成员函数 友元函数不能用const修饰 友元函数可以在类定义的任何地方声明,不受类访问限定符限制 一个函数可以是多个类的友元函数

    46010

    闭关多日,整理一份C++中那些重要又容易忽视的细节

    调用虚函数时,程序将查看存储在对象中的vtbl地址,然后转向相应的函数地址表。如果使用类声明中定义的第一个虚函数,则程序将使用数组中中的第一个函数地址,并执行具有该地址的函数。...一个函数可以是多个类的友元函数,只需要在各个类中分别声明。 友元函数的调用与一般函数的调用方式和原理一致。 友元函数虽然不是类成员却能够访问类的所有成员的函数。类授予它的友元特别的访问权。...我看到一段比较好的解答: 我们已知道类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。...友元是一种定义在类外部的普通函数,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。...友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。 友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。

    74210

    【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作

    成员函数 将const修饰的"成员函数"称之为const成员函数,const修饰类成员函数,实际修饰改成员隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改 问题: cosnt对象可以调用非...非const对象可以调用const成员函数吗? const成员函数内可以调用其他的非const成员函数吗? 非const成员函数内可以调用其他的const成员函数吗?...那么流插入与流提取不是在类中实现,没有隐含的this指针,不能使用const修饰。 对于上面的几个问题的答案: cosnt对象可以调用非const成员函数吗?...(不可以,权限放大) 非const对象可以调用const成员函数吗?(可以,权限缩小) const成员函数内可以调用其他的非const成员函数吗?...(不可以,权限放大) 非const成员函数内可以调用其他的const成员函数吗?

    28900

    类与对象(中)

    1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。...,又打了补丁,即:内置类型成员变量在类中声明时可以给默认值。...6.日期类的实现 7.const成员 将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改...2.要修改成员变量的函数,不能定义成const; 请思考下面的几个问题:(关于权限的问题,注意权限的变化) 1. const对象可以调用非const成员函数吗?...非const对象可以调用const成员函数吗? 3. const成员函数内可以调用其它的非const成员函数吗? 4. 非const成员函数内可以调用其它的const成员函数吗?

    25010

    如何设计一个C++的类?

    类的设计最重要的一点是要表示来自某个领域的概念,拿我最近在做的音视频剪辑来举例,剪辑业务中有轨道的概念,也有片段的概念,每个轨道可包含多个片段,这时候就有些问题需要考虑,在现实世界中,轨道可以复制吗?...tips:const对象上只能调用const成员函数,非const对象上既可以调用非const成员函数,也可以调用const成员函数。 什么时候需要加noexcept?...(int等):传值 参数在函数内不会更改,参数类型如果为class类型:传const引用 类的声明和实现要分开写到不同文件中吗?...如果非内联函数在头文件中定义,多个源文件都引用此头文件时编译器就会报错。至于类的声明写到头文件还是源文件中,视情况而定,看下面这段代码,某些类的声明写到了头文件中,又有些类的声明写到了源文件中!...关于异常处理详细的介绍可以看我这篇文章:《你的c++团队还在禁用异常处理吗?》

    1.7K20
    领券