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

C++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类,...test* this,即这时会出现类型不匹配的错误,visual studio 中会出现类似于下面的错误: 4 所以通过上面的说明,我们知道了为什么const 对象不能调用const成员函数。...* this; 是和void print() const;this指针的类型是一样的,所以常量对象可以调用const成员函数

1.2K20

C++ const各种用法总结

const size_t size; // 对于const的成员变量, [1]必须在构造函数里面进行初始化; [2]只能通过初始化成员列表来初始化; [3]试图构造函数体内对const成员变量进行初始化会引起编译错误...// const成员函数不允许对数据成员进行修改,如果修改,编译器将报错。...…… }; A a(10); a.func(); // 调用函数[1] const A b(100); b.func(); // 调用函数[2] 如何在const成员函数成员变量进行修改???...,而不是一般的对象实例,原因同上; 4.const成员函数的三种用法(参数、返回值、函数)要很好的使用; 5.不要轻易的将函数的返回值类型定为const; 6.除了重载操作符外一般不要将返回值类型定为对某个对象的...const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量程序运行过程只有一份拷贝,而#define定义的常量在内存中有若干个拷贝

1.9K10
您找到你想要的搜索结果了吗?
是的
没有找到

C++对象模型和this指针实例分析(一)

C++对象模型和this指针 成员变量和成员函数分开存储 C++,类内的成员变量和成员函数分开存储 只有静态成员变量才属于类的对象上 class Person { public: Person...() { mA = 0; } //静态成员变量占对象空间 int mA; //静态成员变量不占对象空间 static int mB; //函数也不占对象空间,所有函数共享一个函数实例...this指针概念 通过4.3.1我们知道C++成员变量和成员函数是分开存储的 每一个静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码 那么问题是:这一块代码是如何区分那个对象调用自己的呢...,可用this指针来区分 2.类的静态成员函数返回对象本身,可使用return *this 1.e.g.注意以下代码:传入的形参并不会给成员属性age赋值!...0; } const修饰成员函数函数成员函数后加const后我们称为这个函数为常函数函数内不可以修改成员属性 成员属性声明时加关键字mutable后,函数依然可以修改 常对象: 声明对象前加

27020

C++复习笔记——C++ 关键字

用其声明的变量或函数应该在别的文件或同一文件的其它地方定义(实现)。文件内声明一个变量或函数默认为可被外部使用。 C++ ,还可用来指定使用另一语言进行链接,这时需要与特定的转换符一起使用。...当模板参数使编译器指认一个类型时产生了误解。 class class(类)是 C++ 面向对象设计的基础。使用class关键字声明一个类。 for for是 C++ 的循环结构之一。...const const(常量的,constant)所修饰的对象或变量不能被改变,修饰函数时,该函数不能改变在该函数外面声明的变量也不能调用任何const函数。...只能用于类的静态和非常量数据成员。由于一个对象的状态由该对象静态数据成员决定,所以随着数据成员的改变,对像的状态也会随之发生变化。...如果一个类的成员函数被声明为 const类型,表示该函数不会改变对象的状态,也就是该函数不会修改类的静态数据成员

1.3K30

《C++Primer》第七章 类

因为非常量版本的函数对于常量对象是不可用的,所以我们只能在一个常量对象上调用const成员函数。虽然可以常量对象上调用常量版本或者非常量版本,但显然非常量版本是一个更好的匹配。...默认初始化的发生条件: 我们块作用域中不使用任何初始值定义一个静态变量或者数组时 当一个类本身含有类类型的成员且使用合成的默认构造函数时 当类类型的成员没有构造函数初始值列表显式地初始化时 值初始化的发生条件...类似于全局变量,静态数据成员定义在任何函数之外,因此一旦它被定义,就将一直存在于程序的整个生命周期中 要想确保对象只定义一次,最好的办法是把静态数据成员的定义与其他内联函数的定义放在同一个文件 4....静态成员可用于某些场景,而普通成员不行 静态成员独立于任何对象某些静态数据成员可能非法的场合,静态成员却可以正常地使用。...静态数据成员可以是不完全类型,静态数据成员只能声明它所属类的引用或者指针 我们可以使用静态成员作为默认实参 class Screen { public: // bkground表示一个稍后定义的静态成员

53720

const的那些事

我们不能使用指向const对象的指针修改基础对象,然而如果该指针指向了const对象可用其他方式修改其所指的对象。可以修改const指针所指向的值的,但是不能通过const对象指针来进行而已!...7.类中使用const 一个类,任何不会修改数据成员函数都应该声明为const类型。...如果在编写const成员函数时,不慎修改 数据成员,或者调用了其它const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。使用const关 字进行说明的成员函数,称为常成员函数。...只有常成员函数才有资格操作常量或常对象,没有使用const关键字 明的成员函数不能用来操作常对象。...也就是说const对象只能访问const成员函数。 而add方法又调用了const修饰的take方法,证明了const对象可以访问任意的成员函数,包括const成员函数

60530

C++:09---类静态成员、类常量成员

类静态函数 因为静态函数不属于某一对象,所以函数内不存在this指针 静态成员函数不能被声明为const类型(“静态成员函数是属于类的,而不是某个具体对象,没有具体对象的时候静态成员就已经存在,静态成员函数不会访问到静态成员...原因:静态函数类定义时就已经开辟内存空间,而普通成员只有当定义对象时开会开辟内存空间,所以调用普通成员会出错 普通函数内部可以调用静态成员,也可以调用普通成员。...=178;//错误,不可调用普通成员 } 二、类常量成员(const) const数据成员 特点: const数据成员只能在构造函数的初始化列表进行初始化 const数据成员初始化之后,不允许再次修改值...特点 const函数成员的目的:函数内不准对类的成员数据进行更改 可以改变函数const参数、以及函数内部的局部变量 const成员函数不可调用const函数成员(本质:防止修改const函数内的值...) 优点 能通过const语法防止我们对自身类的数据进行误操作 当对象常量对象时,只允许访问类的常量函数成员 class Cperson { private: const int age;

1.5K40

C++常见的面试知识点

static 作用 1,修饰普通变量,修改变量的存储区域和生命周期,使变量存储静态区,main函数运行钱就分配了空间,如果有初始值就用初始值初始化它,如果没有就用默认的值初始化。...3,修饰成员变量,修饰成员变量使所有的对象只保存一个该变量,而且不需要生成对象就可以访问该成员。...4,修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是static函数内不能访问静态成员。...this 作用 1,this 指针是一个隐式于每一个静态成员函数的特殊指针,它指向调用该成员函数的那个对象。...内联函数相比宏函数来说,代码展开时,会做安全检查或自动类型转换(同普通函数),而宏定义则不会。声明同时定义的成员函数,自动转化为内联函数,因此内联函数可以访问类的成员变量,宏定义则不能。

73621

Dart语言基础语法(一)

配置环境变量 Windows上,通过点击下一步即可安装,安装完成后,若dart命令不可用,则需将dart-sdk下的的bin目录添加到系统Path环境变量。...内置数据类型 Dart,所有能够使用变量引用的都是对象,每个对象都是一个类的实例。数字、函数和 null 也都是对象。所有的对象都继承于Object类。...Dart函数(或方法) 也是对象,它的类型是 Function。...级联运算符可以同一个对象上连续调用多个方法以及访问成员变量。使用它可以避免创建临时变量, 写出更流畅的代码。...条件成员访问符 Java很容易碰到恼人的空指针错误,因此方法调用前需要进行对象空判断,这样的判断语句使代码变得冗长,可读性差,不整洁。Dart则发明了一个新的运算符用于处理此类情况。

2.5K30

什么?CC++面试过不了?因为你还没看过这个!

修饰成员变量,修饰成员变量使所有的对象只保存一个该变量,而且不需要生成对象就可以访问该成员。...修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是 static 函数内不能访问静态成员。 this 指针 this 指针是一个隐含于每一个静态成员函数的特殊指针。...内联函数相比宏函数来说,代码展开时,会做安全检查或自动类型转换(同普通函数),而宏定义则不会。 声明同时定义的成员函数,自动转化为内联函数,因此内联函数可以访问类的成员变量,宏定义则不能。...虚函数指针、虚函数表 虚函数指针:含有虚函数类的对象,指向虚函数表,在运行时确定。...能在栈上 方法:将 new 和 delete 重载为私有 原因:堆上生成对象,使用 new 关键词操作,其过程分为两阶段:第一阶段,使用 new 堆上寻找可用内存,分配给对象;第二阶段,调用构造函数生成对象

3.6K50

C语言与C++面试知识总结

修饰成员变量,修饰成员变量使所有的对象只保存一个该变量,而且不需要生成对象就可以访问该成员。...修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是 static 函数内不能访问静态成员。 this 指针 this 指针是一个隐含于每一个静态成员函数的特殊指针。...内联函数相比宏函数来说,代码展开时,会做安全检查或自动类型转换(同普通函数),而宏定义则不会。 声明同时定义的成员函数,自动转化为内联函数,因此内联函数可以访问类的成员变量,宏定义则不能。...虚函数指针、虚函数表 虚函数指针:含有虚函数类的对象,指向虚函数表,在运行时确定。...能在栈上 方法:将 new 和 delete 重载为私有 原因:堆上生成对象,使用 new 关键词操作,其过程分为两阶段:第一阶段,使用 new 堆上寻找可用内存,分配给对象;第二阶段,调用构造函数生成对象

4.9K41

第4章 类和接口

第21条 用函数对象表示策略 函数对象的概念:如果一个类仅仅导出这样的一个方法(执行其他对象(这些对象被显示传递给这些方法)上的操作),它的实例实际上就等同于一个指向该方法的指针....class) 除了第一种之外,其他三种都被称为 内部类(inner class) 静态成员类 & 静态成员类 最简单的嵌套类,最好把它看成普通的类,只是碰巧被声明另一个类的内部而已(挺不错的解释...所以通常情况更推荐静态成员类,书中有一句话:如果声明成员类不要求访问外围实例,就要始终把static修饰符放在它的声明使它成为静态成员类,而不是非静态成员类 匿名类 & 局部类 匿名类,没有名字,...也不是外部类的成员,它是使用的同时被声明和实例化 需要注意的是:当匿名类出现在静态的环境时,它会持有外部类的实例,所以它可能引起内存泄漏。...匿名类的作用:通常用于创建函数对象(见21条),比如Thread,Runnable 局部类非常少用,自己没用过,源码里也没留意到它的存在,就不多写了。

52330

C#关键字常见面试题

readonly关键字(运行时常量):字段可以声明或构造函数初始化,常作为运行时常量使用。const关键字(编译时常量):字段只能在该字段的声明时初始化,常作为编译时常量使用过。...static 修饰符可用于声明 static 类。类、接口和结构,可以将 static 修饰符添加到字段、方法、属性、运算符、事件和构造函数。static 修饰符不能用于索引器或终结器。...静态类不能包含实例构造函数。但是,它们可以包含静态构造函数。 静态成员静态成员的区别? 成员主要指的是:字段、方法、属性、运算符、事件和构造函数等。...静态成员用static修饰符,静态成员不需要。 静态成员属于类所有,静态成员属于类的实例化对象所有。 静态方法里不能使用静态成员静态方法可以使用静态成员。...this 关键字表示当前对象的引用,可以用于访问当前对象成员。它可以用来区分局部变量和实例变量、构造函数调用其他构造函数、传递当前对象给其他方法等。 base 关键字有什么作用?

14610

PHP学习笔记(二)——行云博客

> 3.超级全局变量 PS:PHP预定义了几个超级全局变量(superglobals) ,这意味着它们一个脚本的全部作用域中都可用。 你不需要特别说明,就可以函数及类中使用。...该变量的值对外是不可见的,但是可以通过成员函数访问,类被实例化为对象后,该变量即可称为对象的属性。 成员函数 − 定义类的内部,可用于访问对象的数据。...构造函数 − 主要用来创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。...> 8.3构造函数 构造函数是一种特殊的方法。主要用来创建对象时初始化对象, 即为对象成员变量赋初始值,创建对象的语句中与 new 运算符一起使用。 <?...静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。 由于静态方法不需要通过对象即可调用,所以伪变量 $this 静态方法可用。 静态属性不可以由对象通过 -> 操作符来访问。 <?

3.7K30

C++ 知识点总结篇

const 不同位置时的不同意义 指针类型前:声明一个指向常量的指针,程序不能通过指针来改变它所指向的值,但指针本身的值可以改变,即指针可以指向其他数据; "*"号和指针名之间,声明一个指针常量(常指针...,但不能有返回类型; 构造函数作用:为对象分配空间、为数据成员赋初值、请求其他资源; 构造函数工作:初始化虚函数表、建立基类对象、建立静态数据成员对象、安置虚基类对象信息、执行构造函数的代码; 若一个类没有定义构造函数...,编译器会自动生成不带参数的默认构造函数,格式为: ::() { } 析构函数 析构函数作用:清除对象、释放内存; 析构函数工作:执行析构函数的代码、将对象占据的存储空间归还系统...、做公共及用户要求的善后工作; 析构函数无参数和返回值,一个类只能定义一个析构函数,故不能重载,格式为: ~(); 内存布局 全局数据区:存放全局变量、静态数据、常量; 代码区:存放类成员函数..., 友元函数 定义过,但不是成员函数,定义类外部,但有权访问类成员; this 指针 只有成员函数才有 this指针,友元函数没有 this 指针; 静态成员函数与普通成员函数区别: 静态成员函数没有

42730

Effective-java-读书笔记之类和接口

第15条 使类和成员的可访问性最小化尽可能地使每个类或者成员不被外界访问.对于顶层(嵌套)的类和接口, 只有两种可能的访问级别: 包级私有(package private)和公有(public).如果一个包级私有的顶层类..., 就要始终把static修饰符放在它的声明, 使它成为静态成员类.常见用法: 作为公有的辅助类, 仅当与它的外部类一起使用时才有意义.私有静态成员类的一种常见用法是用来代表外围类所代表的对象的组件....例如: Map的Entry.静态成员静态成员类的每个实例都隐含着与外围类的一个实例相关联....可以出现在代码任何允许存在表达式的地方.当且仅当匿名类出现在静态环境时, 它才有外围实例. 但是即使它们出现在静态的环境, 也不可能拥有任何静态成员.常见用法: 创建函数对象....只有当局部类静态环境定义的时候, 才有外围实例. 它们也不能包含静态成员.

66571

C++基础 杂记(一)

*p2 = b;//okconst int* const p3 = &a;//指向常量的指针常量 static修饰符 修饰变量、函数 函数内部定义的变量,当程序执行到它的定义处时,编译器为它在栈上分配空间...,在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数此变量的值保存至下一次调用时,如何实现?...,初始化自动为 0 修饰类内成员 静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。...静态成员**可以**通过双冒号来使用::,静态成员引用**必须**与特定对象相对对象.成员名 类的静态成员函数**不能**使用类的静态成员(因为**静态成员函数属于整个类,类实例化对象之前就已经分配空间了...**,而非静态成员类实例化对象后才有内存空间,因而静态成员不认识后来的静态成员) 类的静态成员函数可以调用用静态成员函数,但反之不能 静态成员函数没有 this 指针(因其属于整个类) 类的静态成员变量必须先初始化再使用

37310

初级程序员面试不靠谱指南(二)

C++作为一种面向对象的语言,可以定义类、成员函数等等是其区别于C语言的一个重大特点,const关键字的使用也是有各种陷阱和容易混淆的地方的,为了配合下面的说明,我们定义一个类Mobile。...删去该函数之后,编译通过,也就是说,,可以使用const实现对于成员函数的重载,但是想要达到这一目的摆放的位置很重要。...既然是重载,那么就应该在调用中体现出来,C++是采用如下的方法调用这两个函数的,对于const的对象调用const的函数,而对于const的对象,调用普通的函数,可以通过以下的测试代码证明: Mobile...总之,,可以使用const限制成员函数成员变量的修改,并且可以实现成员函数的重载。 下一个问题可能稍微有些颠覆性,怎样看待一个类的const?...如何将const的强制转换成为const,c++使const_cast(expression)可以将const的值转化成为const的值,但是这个转换指的是const指针转换成为const

66570

左值和右值、左值引用与右值引用、移动语句(2)「建议收藏」

另一方面,C ++,返回引用的函数调用是左值。否则,函数调用是rvalue表达式。C ++,每个表达式都会产生左值,x值,(prvalue)rvalue或无值。...以下表达式是xvalues: 调用返回类型为右值引用类型的函数的结果 强制转换为右值参考 通过xvalue表达式访问的引用类型的静态数据成员 指向成员访问表达式的指针,其中第一个操作数是xvalue...rvalue reference rc的初始值设定项是xvalue,因为它是一个通过xvalue表达式访问静态引用数据成员c的表达式。仅限C ++ 11及以后版本。...C++ 11引入的右值引用正好可用于标识一个非常量右值。...这是因为move构造函数,s虽然是一个非常量右值引用,但其本身却是一个左值(是持久对象,可以对其取地址),因此调用*this = s时,会使用拷贝赋值函数而不是move赋值函数,而这已与move构造函数的语义不相符

2.5K20

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券