首页
学习
活动
专区
工具
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个字节,注意计算类大小的时候要考虑字节对齐的问题。

99410
  • Java基础-面向对象(五)

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

    31820

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

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

    79191

    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”声明?

    2.8K20

    30道最常问的Java基础面试题

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

    30810

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

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

    98920

    C++面试知识总结

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

    1.8K41

    Java类之接口

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

    27020

    爆学C++之类和对象(上)

    类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或者成员函数。...• 为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_ 或者 m开头,注意C++中这个并不是强制的,只是⼀些惯例,具体看公司的要求。...表示它们存在过 */ 我们计算这个类的对象的这个大小可以参考结构体的大小的计算 上⾯的程序运⾏后,我们看到没有成员变量的B和C类对象的⼤⼩是1,为什么没有成员变量还要给1个 字节呢?...• C++中有⼀些相对⽅便的语法,⽐如Init给的缺省参数会⽅便很多,成员函数每次不需要传对象地 址,因为this指针隐含的传递了,⽅便了很多,使⽤类型不再需要typedef⽤类名就很⽅便 • 在我们这个...C语言的数据和方法是分离的,数据是数据,方法是方法 C++将数据和方法封装到一起,将数据和方法都封装到类里面,并且通过这个访问限定符进行管理 封装本质是一种规范的管理 C++是不能访问数据的,因为有访问限定符的存在

    8810

    C++初阶——类和对象

    呀哈喽,我是结衣 C++入门之后,我们就进入了C++的初阶的学习了,在了解类和对象之前,我们还是先了解,面向过程和面向对象的初步认识。...类的引入 C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。...类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。 下面我们来讲解,类的两种定义方式。...但是为了下面我的书写方便,我在写博客的时候会按照第一种方法来写,在私下里大家还是要按照第二种方法来写哦。 3.成员函数命名规则 在讲这个之前,我们先来写一段的代码。...讲我第一个问题我们来讲第二个问题,这个问题也叫做类的访问限定符 4.类的访问限定符及封装 访问限定符 C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用

    8410

    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 的。

    97650

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

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

    2.2K20

    2.类和对象(上)

    类体中内容称为类的成员:类中的变量称为类的属性或成员变量; (类和结构体非常像,跟结构体不一样的就是在类里面可以定义函数)类中的函数称为类的方法或者成员函数。...• 为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前面或者后面加_ 或者 m开头,注意C++中这个并不是强制的,只是一些惯例,具体看公司的要求。...(struct 也可以定义类) 这是我们在C语言中定义的 在C++中就不一样了,在C++中struct就可以定义函数,但是我们遵循1.1第二条的原则,要加一个特殊标识符,就要设计成这个样子了。...上面我们分析了对象中只存储成员变量,C++规定类实例化的对象也要符合内存对齐的规则。 首先也是要考虑内存对齐的问题,其实类的对象实例化里面只存了成员变量,没有存成员函数。...没有成员变量的类对象,开1byte,占位,不存储有效数据。 首先类B和类C是一样的,都没有成员变量,那结果不应该是0吗?为什么会是1呢?

    7410

    【C++】踏上C++的学习之旅(六):深入“类和对象“世界,掌握编程的黄金法则(一)

    前言 在本文中我们即将要接触到C++的第一块"硬骨头"——“类和对象”。为什么说"类和对象"是一块一骨头呢?..."类"的引入 在C语言中,结构体中只能定义变量,在C++中结构体不仅可以定义变量,而且还可以定义函数。...类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。 3.2 "类"的两种定义方式 类的两种定义方式: 声明和定义全部放在类中。...所以我一般建议大家,定义变量名时一定要明确哪个是类中的成员变量,哪个又是成员函数中的变量。解决这个问题的方法就是,以一种特殊的写法来确保类中的成员变量与众不同!...类的访问限定符以及封装 4.1 为什么在类中需要访问限定符? 有些时候,我们期望类中的有些变量是私密的,我不想让你看到,更不想让你访问到。此时我们就可以将成员变量通过访问限定符做到。

    11010

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

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

    47930

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

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

    95820

    C++虚函数表原理浅析

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

    1.6K32

    单例模式

    4.2为什么m_instance写在类外面 在C++中,静态成员变量是属于类的,而不是属于类的某个具体对象。这意味着无论创建多少个类的对象,静态成员变量只有一份拷贝。...虽然我们已经在类内部声明了这个变量,但是我们还需要在类外部进行定义。否则,编译器会报错,说找不到m_instance的定义。 初始化了静态成员变量m_instance。...那紧接着,就会问,那为什么GetInstance()函数定义不写在类外面呢,它写在类里不会报错,毕竟它也是static 在C++中,成员函数(包括静态和非静态)的声明通常在类的定义中进行,而定义(也就是函数体的实现...如果成员函数的定义在类的定义内部,那么这个成员函数会自动成为内联函数。内联函数可以减少函数调用的开销,但是会增加程序的大小。这对于一些小型、频繁调用的函数来说是有利的。...所以引出来下面这个话题 4.3类中静态成员变量和静态成员函数 静态成员变量和静态成员函数在C++中都属于类级别的成员,它们的主要区别在于它们的用途和访问方式。

    7610
    领券