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

为什么子类引用不能指向父类对象

在java、C++等面向对象的语言中,实现多态的方式就是使用父类引用指向子类对象,所以父类引用指向子类对象是没有任何为题的,但是,大家有没有想过,子类引用可以指向父类对象吗?答案是不可以!...首先,在执行这行代码的时候,先把一个4压入栈中,然后去调用operator new这个函数,很明显,这个4就是该函数的一个参数,它完成的任务就是,向堆空间申请4个字节的存储空间,为什么是4个字节?...接下来,我们来看一下,下面两行的反汇编代码,因为Student类继承于Person类,因此Student类里面有agestuId两个变量,又因为是公有的,所以stu可以访问这两个变量的地址,我们对这两个值进行赋值操作...这两个赋值操作的反汇编代码如下,可以明显看出,它们都是先找到stu指向的Person对象的堆空间首地址,然后当给age赋值为18时,是把12h(18的十六进制)塞给Person对象首地址位置开始的4个字节...,当给stuId赋值为2时,是把2(2的十六进制)塞给Person对象首地址+4位置处开始的4个字节, ?

2.4K31

【c++】类对象(六)深入了解隐式类型转换

初始化列表提供了一种高效、直接初始化成员变量基类的方式,而构造函数则完成剩余的初始化逻辑设置,比如动态开辟一个数组进行赋值的时候,就用到函数体 成员变量在类中声明次序就是其在初始化列表中的初始化顺序...这种转换使得单个值可以被视为是该类的一个实例,即使没有显式地调用构造函数 C cc1(1); 这行代码直接调用了C类的构造函数,使用1作为参数创建了cc1对象。...C cc2 = 2; 这行代码演示了隐式类型转换。虽然看起来像是将整数2赋值给cc2,实际上C++编译器解释为使用2作为参数调用C类的构造函数来初始化cc2。...不同于直接初始化(直接调用构造函数),复制初始化涉及到源对象到目标对象的潜在类型转换赋值操作 C obj = value; 在上述代码中,value可以是与C类型兼容的任何值或对象。...这行代码会导致编译错误,原因如下: 引用的基本要求:在C++中,引用必须绑定到一个已经存在的对象上。

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

JavaScript 实践+理论(总结篇):作用域、闭包、this、对象原型

• 动态作用域是在运行时确定的 • 词法作用域关注函数从何处声明 • 动态作用域关注函数从何处调用 第三章 函数作用域块作用域 • 如何区分函数声明函数表达式:如果 function 为声明中的第一个关键字...• var 声明符写在哪里都是一样的,因为它会变量提升。 • let 声明声明的变量函数不会被提升,何为提升,就是在代码执行时是否有被声明过,如果没有声明过则直接抛出错误。 第四章 提升 1....先有鸡(声明),再有蛋(赋值) 2.... var a = 2; 这段声明代码 JavaScript 引擎会将他们分为 var a a = 2; 两个单独的声明来处理,第一个是在编译阶段所执行,第二个是在执行阶段所执行。 3....实际上,new 会劫持所有普通函数并用构造对象的形式来调用它。 • 如下代码: 5. 在 JavaScript 中对于构造函数最准确的解释是,所有带 new 的函数调用。 6. 何为原型链?

6610

在考虑闭包的情况下JS变量存储在栈与堆的区分

全局变量需要特别注意一点:var let/const 的区别。 var:全局的 var 变量其实仅仅是为 global 对象添加了一条属性。...var name = 'zxx'; // 与下述代码一致 windows.name = 'zxx'; let / const:全局的 let/const 变量不会修改 windows 对象,而是将变量的声明放在了一个特殊的对象下...var pwd = 123 变量赋值 其实不论变量是存在栈内,还是存在堆里(反正都是在内存里),其结构存值方式是差不多的,都有如下的结构: 赋值为常量 何为常量?...常量就是一声明就可以确定的值,比如 1、"string"、true、{a: 1},都是常量 假设现在有如下代码: let foo = 1 JavaScript 声明了一个变量 foo,且让它的值为 1,...赋值为变量 何为变量?在上述过程中的 foo、bar、obj,都是变量,变量代表一种引用关系,其本身的值并不确定。 那么如果我将一个变量的值赋值给另一变量,会发生什么?

76320

前端学习(35)~js学习(十二):预编译

(注意,无论在哪个作用域内赋值) 比如说,如果我们直接在代码里写 console.log(a),这肯定会报错的,提示找不到 a。...100 undefined (会报错,提示 Uncaught ReferenceError: a is not defined) 解释: 当执行了foo()函数之后, var a = b = 100 这行连续赋值代码等价于...var a = (b = 100),其执行顺序是: (1)先把 100 赋值给 b; (2)再声明变量 a; (3)再把 b 的值赋值给 a。...(1)创建AO对象。AO即 Activation Object 活跃对象,其实就是「执行期上下文」。 (2)找形参变量声明,将形参名变量作为 AO 的属性名,值为undefined。...(3)将实参值形参统一,实参的值赋给形参。 (4)查找函数声明,函数名作为 AO 对象的属性名,值为整个函数体。 这个地方比较难理解。但只有了解了函数的预编译,才能理解明白函数的执行顺序。

43510

【C++】面向对象编程引入 ② ( 面向对象编程 | 类的正确定义方式 | 类的错误定义方式 | 错误分析 )

面积 a 都是通过调用 caculate 成员方法计算的 ; 声明 Circle 对象之后 , 先调用 setR 方法设置圆半径 , 然后调用 caculate 函数计算出 周长和面积 , 最终才能获取到..., 并不分配内存 ; 使用 Circle c; 代码 声明 c 对象时 , 开始在 栈内存中为 Circle 对象分配内存 ; 分配内存时 , 同时也会对 对象 中的 成员变量赋值 ; 首先 , 为成员变量...double r; 分配内存 , 之后对其赋值 , 由于开发者没有在声明类时赋值 , 此时是随机值 , 可能很大 , 也可能很小 ; 然后 , 为成员变量 double p = 2 * 3.14 *..., 计算出一个 面积 a , 此时 a 也是随机值 ; 分配内存完毕后 , Circle c; 这行代码正式执行完毕 ; 执行 // 从命令行标准输入得到的数据 到 变量 r 指示的内存空间中 cin...>> c.r; 代码 , 从命令行接收一个数值 , 赋值给 c 对象的 r 变量 , 此时 只修改 r 变量 , p a 变量并没有修改 ; 下面的两行代码 , 只在初始化时执行 , 之后不会再执行

9210

从JS底层理解var、let、const

变量提升(hoisting) 为了更好地解释声明提升,下面例子中使用 var 而不是使用 ES6新增的letconst(它们不存在声明提升) 下面的代码输出什么 a = 2; var a; console.log...(a); // 2 可能有人会认为是 undefined, 因为 var a 声明在 a = 2之后,会被重新赋值为 undefined。...所以正确的思考思路是:包含变量函数在内的所有声明都会在任何代码被执行前首先被处理。 当你看到 var a = 2时,可能会被认为这是一个声明。...第二个例子会按照以下流程进行处理 var a; console.log(a); a = 2; 注意:只有声明本身会被提升,而赋值或其他运行逻辑会留在原地。...因此,将一个对象声明为常量必须非常小心。

1.9K30

C++ 温习笔记(2) - extern,预处理命令#pragma,static

extern “C” extern “C”的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern “C”后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。...:在启动结束时执行函数 static 静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的。...也不能在类的构造函数中初始化该成员,因为静态数据成员为类的各个对象共享,否则每次创建一个类的对象则静态数据成员都要被重新初始化。 静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。...你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值。 静态成员的值对所有的对象是一样的。静态成员可以被初始化,但只能在类体外进行初始化。...int x; int y; public: static int num; static int Getnum() { x+=5; // 这行代码是错误的

66710

1、ES6数组与对象的解构赋值详解

八、知识拓展 1、ES6数组与对象的解构赋值详解 数组的解构赋值 基本用法 ES6允许按照一定的模式,从数组对象中提取值,对变量进行赋值,这被称之为解构(Destructuring) // 以前为变量赋值...name age 但是:其实是声明了两个变量 name:等于对象person 中的name属性的值 age:等于对象person 中的 age属性的值 */ let { name, age...} = person console.log(name,age) 如上面注释中所说,声明了变量 nameage,然后分别从对象person中寻找与变量同名的属性,并将属性的值赋值给变量 所以,...声明变量 l_age, 并从对象person中获取age属性的值赋予此变量 这里的重点是下面这行代码 let {name:l_name,age:l_age}=person 1 按照创建对象字面量的逻辑...但注意,这里是声明变量,并不是创建对象字面量,所以争取的解读应该是 声明变量 l_name,并从person 对象中找到与 name 同名的属性,然后将此属性的值赋值给变量 l_name 所以,我们最后输出的是变量

73220

【c++】类对象(七)

在上面的代码示例中,Getn 函数是一个静态成员函数,它的主要特点用法包括: 类范围内的函数:静态成员函数属于整个类,**而不是类的某个特定对象。...>的重载 我们在前面讲到各种运算符重载,以及赋值运算符重载,那么能不能直接重载>,实现输入输出呢?...int main() { const A& aa2 = 2; return 0; } 这里就只有构造,没有拷贝构造,没有进行优化,原因如下: 当你在C++中使用const A& aa2 = 2;这行代码时...下面是详细解释: 临时对象的构造 首先,2是一个整数字面量,它本身并不是A类型的对象。当这行代码执行时,C++需要一个A类型的对象来与aa2绑定。...这行代码实际上告诉编译器:“创建一个临时的A对象,并将aa2作为这个临时对象的一个常量引用。”

6420

对大数据技术的认识_java.lang.String

先定义一个长度为10的Integer数组,并随机为其赋值,在通过for循环为长度为10万的String对象依次赋值,这些值都来自于Integer数组。...s.intern(),这一行的作用是s对象去常量池中寻找后发现“1”已经存在于常量池中了。 String s2 = “1”,这行代码是生成一个s2的引用指向常量池中的“1”对象。...String s3 = new String(“1”) + newString(“1”),这行代码在字符串常量池中生成“1” ,并在堆空间中生成s3引用指向的对象(内容为”11″)。...String s2 = “1”,这行代码是生成一个s2的引用指向常量池中的“1”对象,但是发现已经存在了,那么就直接指向了它。 s.intern(),这一行在这里就没什么实际作用了。...String s3 = new String(“1”) + newString(“1”),这行代码在字符串常量池中生成“1” ,并在堆空间中生成s3引用指向的对象(内容为”11″)。

276130

C#简单的面试题目(二)

{   ////another  code } Class.eventhandels=new handels(test); 18.传入某个属性的SET方法的隐含参数的名称是什么 value ,它的类型属性所声明的类型相同...每次使用System.String类中的方法之一或进行运算时(赋值、拼接等)时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。而StringBuilder则不会。...不能,因为其为Struct类型,而结构属于值类型,值类型不能为null,只有引用类型才能被赋值为null 25.DateTime.Parse(myString);这行代码有什么问题?...(Exception e){throw;}的区别 前者将发生的异常对象抛出,而后者只是抛出异常,并没有抛出原异常对象 29.errorException的区别 error表示恢复不是不可能但很困难的情况下的一种严重问题...30.Static非Static的区别: 一.用Static声明的方法变量,不需要实例化该类就调用; 二.非Static的,就一定要用实例化的对象来调用,即用new来实例化。

52610

Javascript 严格模式 “use strict”

如果这行语句不在第一行,则无效,整个脚本以”正常模式”运行。如果不同模式的代码文件合并成一个文件,这一点需要特别注意。...4.1 全局变量显式声明 在正常模式中,如果一个变量没有声明赋值,默认是全局变量。严格模式禁止这种用法,全局变量必须显式声明。...也就是说,属性方法到底归属哪个对象,在编译阶段就确定。这样做有利于编译效率的提高,也使得代码更容易阅读,更少出现意外。 具体来说,涉及以下几个方面。...(1)对象不能有重名的属性 正常模式下,如果对象有多个重名属性,最后赋值的那个属性会覆盖前面的值。严格模式下,这属于语法错误。   ...为了与新版本接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数。

94210

Javascript 严格模式详解

如果这行语句不在第一行,则无效,整个脚本以"正常模式"运行。如果不同模式的代码文件合并成一个文件,这一点需要特别注意。...4.1 全局变量显式声明 在正常模式中,如果一个变量没有声明赋值,默认是全局变量。严格模式禁止这种用法,全局变量必须显式声明。...也就是说,属性方法到底归属哪个对象,在编译阶段就确定。这样做有利于编译效率的提高,也使得代码更容易阅读,更少出现意外。 具体来说,涉及以下几个方面。...(1)对象不能有重名的属性 正常模式下,如果对象有多个重名属性,最后赋值的那个属性会覆盖前面的值。严格模式下,这属于语法错误。   ...为了与新版本接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数。

1.1K80

javascript——函数、变量方法

arguments,可以获得调用者传入的所有参数 arguments代表传入的参数,arguments.length代表传入参数的长度 console.log(arguments.length) // 这行代码写在函数中...a = 1; }; a = a + 1; // err 这行代码直接报错,因为全局中没有a这个变量 如果两个函数体中各自声明了变量a,互不干扰,在自己的函数体内可以正常作用,出了函数体都没有作用了...() 2.变量提升 JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部,但是并不会将赋值一起提升,很容易产生代码的报错 因此,针对这一问题,我们在声明变量的时候...如果全局作用域中也没有,那么就报错 6.常量 varlet声明的是一个变量,在ES6之间,用大写的变量名,表示定义一个常量 // ES5 var NAME = 'xiaoming' ES6新增一个关键字...var b = 2; [a, b] = [b, a] 四、对象的方法 绑定到对象上的函数被称为方法 在一个对象中绑定函数,称为这个对象的方法 1.this 下面段代码返回的是(今年的年份-出生年份) var

1.1K20

【深入浅出C#】章节 2:数据类型变量:变量常量的声明初始化

一、何为变量 1.1 变量在程序中的作用重要性 变量在程序中扮演着重要的角色。它们用于存储操作数据,为程序提供了灵活性可扩展性。...声明变量的语法通常是使用关键字(int、float、string等)后面跟着变量名。 变量初始化是给变量赋予初始值的过程。初始化变量可以在声明变量时直接赋值,也可以在稍后的代码中进行赋值。...salary salary = 5000.50; // 在稍后的代码中给变量salary赋值 Tip:一般情况下,变量的声明应尽量放在首次使用之前,以确保变量已经被正确声明初始化。...使用赋值运算符构造函数进行初始化可以根据具体情况选择适合的方式。赋值运算符适用于简单的赋值操作,而构造函数适用于对象的实例化初始化。...通过声明常量,我们可以避免在代码中使用硬编码的字面量,提高代码的可读性可维护性。同时,我们也讨论了只读变量的概念用法,以在运行时确定常量值或对象实例化时初始化。

32320
领券