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

为什么在这个方法中声明这个变量会覆盖我的类成员(C++)?

在C++中,如果在一个方法中声明了一个与类成员同名的变量,那么这个变量会覆盖类成员的值。这是因为在C++中,变量的作用域是由声明它的位置决定的,而在方法中声明的变量会覆盖类成员的作用域。

当在方法中声明一个同名变量时,编译器会优先使用方法中的局部变量,而不是类成员变量。这意味着在方法中使用该变量时,实际上是在使用方法中的局部变量,而不是类成员变量。

这种行为可以通过使用作用域解析运算符(::)来解决。通过在变量名前加上类名和作用域解析运算符,可以明确指定使用类成员变量而不是方法中的局部变量。

例如,假设有一个类成员变量int x和一个方法中的局部变量int x。如果在方法中直接使用x,那么实际上使用的是方法中的局部变量。如果要使用类成员变量x,可以使用类名和作用域解析运算符来引用它,例如MyClass::x。

这样做可以避免变量覆盖的问题,确保在方法中使用的是类成员变量而不是局部变量。

总结起来,声明同名变量会覆盖类成员的原因是C++中变量的作用域规则。为了避免这种问题,可以使用作用域解析运算符来明确指定使用类成员变量。

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

相关·内容

为什么Java成员变量不能被重写?成员变量Java能够被重写么?不会重写成员变量,而是隐藏成员变量访问隐藏域方法

这篇文章讨论了Java面向对象概念中一个基本概念--Field Hiding(成员变量隐藏) 成员变量Java能够被重写么?...意思就是: 一个,子类成员变量如果和父成员变量同名,那么即使他们类型不一样,只要名字一样。父成员变量都会被隐藏。子类,父成员变量不能被简单用引用来访问。...而是,必须从父引用获得父被隐藏成员变量,一般来说,我们不推荐隐藏成员变量,因为这样会使代码变得难以阅读。...其实,简单来说,就是子类不会去重写覆盖成员变量,所以成员变量访问不能像方法一样使用多态去访问。...访问隐藏域方法 就是使用父引用类型,那么就可以访问到隐藏域,就像我们例子代码 就是使用类型转换System.out.println(((Super)c1).s); 翻译自http://www.programcreek.com

3.5K40

c++和继承面试点25连问

成员函数重载、覆盖和隐藏区别 重载即为函数重载,重载特征: 相同范围,也就是同一个; 函数名字相同; 函数参数不同; virtual关键字无影响。...构造函数里面”初始化列表”和”赋值”区别 初始化列表和赋值区别如下: 初始化列表只会调用一次构造函数,其实就是变量声明时初始化; 赋值先调用构造函数,再调用一次赋值函数,它相当于声明后,又进行了赋值...构造函数什么情况下必须使用初始化列表 实际上,根据上面第8点,赋值是先声明以后再赋值,我们初次接触c++时候就应该知道有些类型是必须要声明时候就有初值,这里想到有以下类型: const声明变量...友元是什么 与友元函数类似,一个A声明另外一个B为friend类型,那么这个B就是友元,它访问A私有成员和保护成员都不受限制。...由成员变量和是否有虚函数决定,如果类中有虚函数,那就在所有成员变量基础上加上一个虚函数指针大小,64位机器,虚函数指针为8个字节,注意计算大小时候要考虑字节对齐问题。

88910

Java基础-面向对象(五)

上转型对象可以操作子类继承或重写成员变量方法 如果子类重写了父某个方法,上转型对象调用该方法时,是调用重写方法。...final int x=3; x=4; 修饰方法:final方法子类不能被覆盖方法 final returnType methodName(paramList){...} final void...抽象子类必须覆盖所有的抽象方法才能被实例化,否则还是抽 象 接口 interface 为什么需要接口?接口和抽象区别?...Java与C++对比 C++支持多重继承,Java支持单重继承 C++多重继承危险性在于一个可能继承了同一个方法不同实现,导致系统崩溃。...内部类做为外部类成员,可声明为private、默认、protected或public。 内部类成员只有在内部类范围之内是有效。 用内部类定义在外部类不可访问属性。

29620

C++重要知识点小结---1

[cpp] view plaincopy >上有个好记方法:const*号左边修饰是指针所指内容;const*号右边修饰是指针。  ...尽管这个答案不是完全答案,但我接受它作为一个正确答案。(如果你想知道更详细答案,仔细读一下Saks文章吧。)如果应试者能正确回答这个问题,将问他一个附加问题:下面的声明都是什么意思?...顺带提一句,也许你可能问,即使不用关键字const,也还是能很容易写出功能正确程序,那么为什么还要如此看重关键字const呢?也如下几下理由: 1)....《C++程序设计教程》P352 例子并没有声明派生GraduateStudent构造函数,根据实现机制,派生对象创建时,将执行其默认构造函数。...编译时就能确定哪个重载函数被调用,称为先期联编。 多态性可可以简单概括为“一个借口,多种方法”,程序运行过程才决定调用函数。 虚函数就是允许被其子类重新定义成员函数。

73891

C++面试题,阿里、百度、腾讯、华为、小米100道C++面试题目及答案

为了使这种行为可行,我们把基Shape函数Draw()声明为虚函数,然后派生重新定义Draw()使之绘制正确形状,这种方法覆盖,虚函数声明方法函数原型之前加上关键之virtual...5、C++ 程序调用被 C 编译器编译后函数,为什么要加 extern “C”声明?...(2)c++可以定义成员函数,struct只能定义成员变量。 (3)C++有继承、多态特性,struct没有。 3、IP组播有那些好处?...16、C++程序调用被C编译器编译后函数,为什么要加extern“C”声明?...四、【华为C++面试题】 1、C++程序调用被C编译器编译后函数,为什么要加extern“C”声明

1.6K20

30道最常问Java基础面试题

三者之间联系与区别**这几个是Java很基本很基本东西,但是相信一定还有很多人搞不清楚!为什么呢?因为我们大多数时候使用现成编译工具以及环境时候,并没有去考虑这些东西。...Java和C++区别**知道很多人没学过C++,但是面试官就是没事喜欢拿咱们Java和C++比呀!没办法!!!就算没学过C++,也要记下来!...什么是Java程序?应用程序和小程序有何不同?**一个程序可以有多个,但只能有一个是主Java应用程序这个是指包含main()方法。...**从语法形式上,看成员变量是属于,而局部变量方法定义变量或是方法参数;成员变量可以被public,private,static等修饰符所修饰,而局部变量不能被访问控制修饰符及static...静态方法访问本类成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制.**24. 对象相等与指向他们引用相等,两者有什么不同?

26910

Java 小白成长记 · 第 6 篇「为什么说要慎用继承,优先使用组合」

(); } // 通过调用成员变量固有方法使新具有相同功能 public void beat(){ animal.beat(); } // 为新增加新方法 public...另外,一定要注意是:「覆盖一个方法时候,子类方法不能低于父方法可见性」。特别是, 如果超方法是 public, 子类方法一定要声明为 public。...需要注意是:「父引用变量指向子类对象后,只能使用父声明方法」,但方法如果被重写执行子类方法,如果方法未被重写那么将执行父方法。 ② 向下转型 不仅存在向上转型,还存在向下转型。...Java 单继承 深入学习 Java 之前,其实是 C++,而 C++ 是支持多继承,也就是说 A 可以同时继承 B 和 C 甚至更多。...出现这种情况原因,就是「父覆盖方法调用了别的可覆盖方法,这时候如果子类覆盖了其中一些方法,就可能导致错误」。

83120

C++面试知识总结

普通局部变量定义它函数内有效,这个函数返回会后失效。 static局部变量自动初始化,而局部变量不会。...2.23 有一个char * 型指针刚好指向一些int 型变量, 想跳过它们。 为什么((int *)p)++; 不行? 类型转换实质“把这些二进制位看作另一种类型, 并作相应对待”。...多态:通过继承同一个基,产生了相关不同派生,与基同名成员函数不同派生中会有不同实现,也就是说:一个接口、多种方法。...模块内static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问。 模块内static函数只可被这一模块内其它函数调用,这个函数使用范围被限制声明模块内。...static成员变量属于整个所拥有,对所有对象只有一份拷贝。 static成员函数属于整个所拥有,这个函数不接收this指针,因而只能访问static成员变量

1.7K41

Java之接口

多继承造成 1、若子类继承拥有相同成员变量,子类引用该变量时将无法判别使用哪个父成员变量 2、若一个子类继承多个父拥有相同方法,同时子类并未覆盖方法(若覆盖,则直接使用子类方法...多层继承:实际就是多个单继承累积,最下面的子类可以具备前几个父特征,但这样多继承造成代码冗余,可读性较差,一般开发同学都不会这样浪费时间。 内部类:通过成员内部类实现多继承。...官方解释是这样: Java接口是一系列方法声明,是一些方法特征集合,一个接口只有方法特征没有方法实现,因此这些方法可以不同地方被不同实现,而这些实现可以具有不同行为(功能) 接口优势...因为Java不像C++一样支持多继承,所以Java可以通过实现接口来弥补这个局限。 接口也被用来实现解耦。 接口被用来实现抽象,而抽象也被用来实现抽象,为什么一定要用接口呢?...接口和抽象之间又有什么区别呢?原因是抽象内部可能包含非final变量,但是接口中存在变量一定是final,public,static

24620

C++学习知识点

C++,实现多态有以下方法:虚函数,抽象,重载,覆盖,模板。 2.特征 答:封装、继承和多态。 3. C++与C#区别 (1)C++申明时,不能给数据成员赋值,通常使用构造函数来完成。...当这个函数内部定义时,就可以不用inline关键字了。...使用const修饰引用表示常引用,即引用变量是常变量,这样一来,是防止函数对常引用修改,多用于修饰常对象。如果将值调用形参声明为常量,则没有多大使用价值。...编译器对虚函数处理过程 C++数据成员是独立,每申明一次对象,就会为成员数据分配内存空间,所以成员数据变量存储在对象空间中,成员函数是编译阶段确定存储空间和地址,故成员函数对于不同对象是共享...深拷贝存在情况就是成员中有非基本数据类型变量时,比如指针,数组或者引用。

1.7K20

Java面试中最常见10个问题,Java底层知识,花点时间学习一下

Java 是否可以覆盖(override)一个 private 或者 是static 方法? “static”关键字表明一个成员变量或者是成员方法可以没有所属实例变量情况下被访问。...4.是否可以 static 环境访问非 static 变量? static 变量 Java 是属于,它在所有的实例值是一样。...当新对象被创建时候,构造函数会被调用。每一个都有构造函数。程序员没有给提供构造函数情况下,Java 编译器会为这个创建一个默认构造函数。 Java 构造函数重载和方法重载很相似。...但是,可以不实现抽象声明所有方法,当然,在这种情况下,也必须得声明成是抽象。 ? 网络配图 抽象可以不提供接口方法实现情况下实现接口。...Java 接口中声明变量默认都是 final 。抽象可以包含非 final 变量。 Java 接口中成员函数默认是 public

92550

C++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】

全局/静态存储区,全局变量和静态变量被分配到同一块内存以前C语言中,全局变量又分为初始化和未初始化C++里面没有这个区分了,他们共同占用同一块内存区。...,但不是同一个变量函数改变这个变量指向不影响实参,而引用却可以。...static第四个作用:C++成员声明static 函数体内static变量作用范围为该函数体,不同于auto变量,该变量内存只被分配一次,因此其值在下次调用时仍维持上次值;...模块内static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问; 模块内static函数只可被这一模块内其它函数调用,这个函数使用范围被限制声明模块内; ...static成员变量属于整个所拥有,对所有对象只有一份拷贝; static成员函数属于整个所拥有,这个函数不接收this指针,因而只能访问static成员变量

1.8K20

C++虚函数表原理浅析

+内存分区 C++内存分区大概分成五个部分: 栈(stack):是由编译器需要时自动分配,不需要时自动清除变量存储区,通常存放局部变量、函数参数等。...,new底层实现代码调用了malloc,new可以看成是malloc智能化高级版本) 你可能问:静态成员函数和非静态成员函数都是定义时放在内存代码区,因而可以说它们都是属于,但是为什么只能直接调用静态成员函数...C++实现虚函数方法是:为每个对象添加一个隐藏成员,隐藏成员保存了一个指针,这个指针叫虚表指针(vptr),它指向一个虚函数表(virtual function table, vtbl) 虚函数表就像一个数组...,指向基虚函数表 派生对象也将包含一个虚表指针,指向派生虚函数表 如果派生重写了基方法,该派生虚函数表将保存重写虚函数地址,而不是基虚函数地址 如果基方法没有派生重写...也就是说 虚函数按照其声明顺序放于表虚函数子类虚函数前 单继承(有覆盖) 现在我们修改下Derive ?

1.2K31

关于Java基础你不得不会34个问题

一个静态方法内调用一个非静态成员为什么是非法 由于静态方法可以不通过对象进行调用,因此静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。 15....成员变量与局部变量区别有那些 从语法形式上,看成员变量是属于,而局部变量方法定义变量或是方法参数;成员变量可以被 public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰符及...static 所修饰;但是,成员变量和局部变量都能被 final 所修饰; 从变量在内存存储方式来看:如果成员变量是使用 static修饰,那么这个成员变量是属于,如果没有使用使用 static...修饰,这个成员变量是属于实例。...当用final修饰一个时,表明这个不能被继承。final所有成员方法都会被隐式地指定为final方法。 使用final方法原因有两个。

92120

【附答案】关于Java基础你不得不会34个问题

一个静态方法内调用一个非静态成员为什么是非法 由于静态方法可以不通过对象进行调用,因此静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。 15....成员变量与局部变量区别有那些 从语法形式上,看成员变量是属于,而局部变量方法定义变量或是方法参数;成员变量可以被 public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰符及...static 所修饰;但是,成员变量和局部变量都能被 final 所修饰; 从变量在内存存储方式来看:如果成员变量是使用 static修饰,那么这个成员变量是属于,如果没有使用使用 static...修饰,这个成员变量是属于实例。...当用final修饰一个时,表明这个不能被继承。final所有成员方法都会被隐式地指定为final方法。 使用final方法原因有两个。

46530

C++都有对象了,你还没有吗?

结构体我们可以定义各种类型变量,但是我们不能在结构体定义函数. C语言中: 同样一段代码C++,结构体内不仅可以定义变量,也可以定义函数。 C++: 为什么呢?...因为C++中将结构体升级为了==“”.==是可以定义函数,通常被称为成员函数. C++,class关键字用于定义一个是一个用户定义数据类型。...内容称为成员:可以包含属性(成员变量)和操作/方法成员函数)。 2.2 定义方式 使用class关键字可以创建一个新,并定义它特征(如数据成员成员函数)。...是初阶牛,年龄是18岁 这个名字叫做 Person,它有两个私有成员变量:name 和 age。 还有一个公有的成员函数:introduce。...(2)声明和"成员函数"分离 即声明放在.h文件成员函数定义放在.cpp文件.

16220

同时由于const类型无法自动转化为非const类型,所以const型对象只能调用const成员函数。 作用域:本身就是一个作用域,所有成员定义这个作用域中。...编译器在编译时候分两步,首先编译成员声明,然后编译成员函数,因此成员函数可以随意使用其他成员而不用关心这些成员出现顺序。...如果一个函数概念上属于这个,但是不定义为成员函数,一般将这个定义声明头文件 访问控制与封装 一般来说定义时候应该将数据成员定义为私有或者保护类型,通过成员函数来访问数据成员...当把成员函数声明为友元时候,我们必须明确指出该成员属于哪个 如果一个想把一组重载函数声明为友元,它需要对这组函数每一个分别声明 作用域 一个就是一个作用域,外部类成员都被隐藏起来了...c++ ,内层作用域中同名成员覆盖外层,当函数内部或者内部定义了与全局作用域相同变量时,要使用全局作用域中变量可以使用:: 构造函数相关 构造函数初始化列表相当于先定义再赋值,而要做到对成员变量定义同时初始化

58210

C++笔试面试题整理

对象内存布局,如果有虚函数,首先是该类vtbl指针,然后才是对象数据,对象数据都是顺序存放,当然涉及到字节对齐,这样带来存取效率提升。...如果使用了这个修饰词,就是通知编译器别犯懒,老老实实去重新读一遍!可能太“通俗”了,那么引用一下“大师”标准解释: volatile本意是“易变”。...事实上,如果一个中含有虚函数,则系统会为这个分配一个指针成员指向一张虚函数表(vtbl),表每一项指向一个虚函数地址,实现上就是一个函数指针数组。 什么是多态?...当一个A没有生命任何成员变量成员函数,这时sizeof(A)值是多少,请解释一下编译器为什么没有让它为零。 为1。...静态特征是指能描述对象一些属性(成员变量),动态特征是指对象表现出来行为(成员函数) 头文件中进行声明,在对应实现文件中进行定义有什么意义?

2.5K30

【细品C++】初识和对象

但是由于C语言语法,也没什么好解决方式了。 而为了解决这个问题,C++设计了(struct和class)。C++,我们可以将成员变量和管理用函数同时定义。...//成员变量 int _data; int _size; int _capacity; }; 而这些定义函数,我们通常称之为成员函数或者成员方法。...内容称为成员变量称为属性或成员变量函数称为方法或者成员函数。...为什么不是刚刚提到另外两个存储方式呢?既然内部没有存储函数,那成员函数存储到哪去了呢?如果是你会想要采用哪种设计呢?为什么?...C++通过可以将数据以及操作数据方法进行完美结合,通过访问权限可以控制那些方法外可以被调用,即封装,使用时就像使用自己成员一样,更符合人类对一件事物认知。

13830

C++重要知识点小结---2

所以必须把父所有变量都继承下来,这样既能保护父变量也能使用父函数。 6.继承访问控制 继承分为公共继承、保护继承和私有继承。 公共继承,基每个成员子类中保持同样访问方式。...即在基为public成员,子类可以访问,并据为public;基为protected成员,子类也可访问之,并据为protected;基为private成员子类不能访问之,这就像在应用程序不能访问似有成员一样...访问控制权限: 私有继承时,基不管是公有的,还是保护或者为私有的,一律子类变成私有成员。 保护继承时,基公共和保护成员子类变成保护,而基私有的成员子类变成私有的。...virtual函数必需子类再次声明,明确告诉子类有这个方法,否则编译时报错,getRange方法声明错误。...纯虚函数 C++纯虚函数用于表示一个不能被创建实例, 必需是子类覆盖方法定义后,方可新建实例,格式是虚函数后面添加 = 0。

78270
领券