引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用。 指针在任何时候都可以改变为指向另一个对象。 引用的创建和销毁并不会调用类的拷贝构造函数。...memcpy是内存拷贝函数,可以拷贝任何数据类型的对象。 strcpy只能拷贝字符串,遇到’\0′结束拷贝。 2.10 指针在16位机,32位机,64位机中分别占多大内存 16位机:2字节。...3.5 基类和子类的构造、析构顺序 定义一个对象时先调用基类的构造函数、然后调用派生类的构造函数 先派生类的析构后基类的析构,也就是说在基类的的析构调用的时候,派生类的信息已经全部销毁了 3.6 深拷贝与浅拷贝的区别...深拷贝意味着拷贝了资源和指针 浅拷贝只是拷贝了指针,没有拷贝资源 3.7 构造函数的特点 构造函数只在建立对象的时候自动被调用一次 构造函数必须是公共的,否则无法生成对象 构造函数只负责为自己的类构造对象...在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝。 在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。
,例如 int *const p1=&i,const int ci =42;底层指针:指针所指向的对象是常量,const int *p2=&ci;常量在类中使用:对于不修改类成员变量的成员函数,例如,get...操作的成员函数最好定义为常量成员函数;常量对象、常量对象的引用或指针都只能调用常量成员函数。...初始化列表类的常量和引用成员必须在初始化列表中初始化,因为这两类成员不支持赋值操作,对象通过初始化列表初始化避免调用对象的默认构造函数进行初始化,因此效率更高。...类是C++实现面向对象编程的三大特征:继承、封装、动态的方式之一;类具备构造函数和析构函数。类构造函数/默认构造函数:控制对象的初始化过程,成员的初始化顺序与它们在类定义中出现的顺序一致。...类设计的工具拷贝、赋值、销毁拷贝构造函数:将一个对象作为非引用实参、将一个非引用对象直接作为函数返回值、用花括号列表初始化一个数组或者一个类成员时均使用了拷贝构造函数。
类的基本思想是 数据抽象 和 封装。数据抽象是一种依赖于 接口 和 实现 分离的编程艺术。类的接口包含 用户所能执行的操作;类的实现则包含 类的数据成员,负责接口实现的函数体,以及各种私有函数。...常量对象,以及常量对象的指针或者引用都只能调用常量成员函数。...构造函数 类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些特殊的函数就是构造函数,构造函数的任务是初始化对象的数据成员,无论何时,只要类的对象被创建,就会执行构造函数。...当对象不再存在,比如当一个局部对象所在块结束时,会被销毁,数组或容器中被销毁时,其中存储的对象也会被销毁。...友元类也是一样,在一个类中使用friend声明 另一个类,另一个了就可以访问该类中的成员了。同样,也可以让其他类中的一个成员函数 来作为当前类的友元函数,也是使用friend修饰一下。
有了虚函数,基类指针指向基类对象时就使用基类的成员(包括成员函数和成员变量),指向派生类对象时就使用派生类的成员,从而实现多态。...const int *a,其中a为指向int型变量的指针,const在 * 左侧,表示a指向不可变常量。...当派生类在创建对象的时候会调用基类的构造函数,但是如果基类的构造函数是虚函数的话,派生类的构造函数又会把基类的构造函数覆盖,所以无法进一步执行而出错。...浅拷贝: 在拥有指针成员的类中,一个对象利用拷贝构造函数或者赋值函数拷贝或者赋值给另一个对象的时候,直接将这个对象的指针成员赋值给另一个对象的指针成员,将一个指针赋值给另一个指针,就会使两个指针指向同一个空间...开放地址法:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中
定义的静态成员 常量池:存放常量 非RAM(随机存取存储器)存储:硬盘等永久存储空间 ---- 前瞻: new出的空间都是作为动态内存在堆中分配的,比如new出的对象的成员属性、使用new开辟的数组中的各个元素...,它的对象实体(成员属性)存储在堆区,而对象(名)保存在栈区,是对堆区的成员属性的引用 num是new出来的一个数组,它的数据元素存储在堆区,而数组(名)保存在栈区,是对堆区的数据元素的引用,数据元素又是...Point的对象,是堆区的成员属性的引用 常量存储在常量池 ---- Java内存分配中的栈 在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。...而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍...除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用,比如: 类和接口的全限定名; 字段的名称和描述符;
:哈希码GC 分代年龄锁状态标志线程持有的锁偏向线程 ID偏向时间戳对象头可能包含类型指针,通过该指针能确定对象属于哪个类。...如果对象是一个数组,那么对象头还会包括数组长度。实例数据实例数据部分就是成员变量的值,其中包括父类成员变量和本类成员变量。对齐填充用于确保对象的总长度为 8 字节的整数倍。...对象的创建过程 图片类加载检查虚拟机在解析.class文件时,若遇到一条 new 指令,首先它会去检查常量池中是否有这个类的符号引用,并且检查这个符号引用所代表的类是否已被加载、解析和初始化过。...分配之时从空闲列表中找到一块足够大的内存空间划分给对象实例。这种方式称为“空闲列表”。 初始化分配完内存后,为对象中的成员变量赋上初始值,设置对象头信息,调用对象的构造函数方法进行初始化。...至此,整个对象的创建过程就完成了。对象的访问方式 所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配的。
定义的静态成员 常量池:存放常量 非RAM(随机存取存储器)存储 java内存分配中的栈 在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。...java内存分配中的堆 堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机的自动垃圾回收期来管理。...而数组或对象本身在堆中分配,即使程序运行到使用new产生数组或对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向他的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放...除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用,比如: 类和接口的全限定名; 字段的名称和描述符;...day,month,year为成员变量,它们存储在堆中(new BirthDate()里面)。当BirthDate构造方法执行完之后,d,m,y将从栈中消失。
图3-2 对象引用做函数参数 3.2 this指针 3.2.1 特点 该指针是隐含于每一个类的成员函数中的特殊指针 该指针指向正在被某个成员函数操作的对象 *this标识调用该成员函数的对象 3.2.2...图3-13 常数据成员 3.8 子对象 当一个类的成员是另一个类的对象时,该对象就为子对象 子对象即对象成员 当类中出现了子对象(对象成员)时,该类的构造函数要包含对子对象的初始化,通常采用成员初始化列表的方法来初始化子对象...图3-14 子对象 3.8.2 说明 子对象必须在成员初始化列表中初始化 建立一个对象时,它的所有子对象一起建立 先执行子对象构造函数,再执行对象的构造函数体 析构函数的执行顺序与构造函数的执行顺序严格相反...构造函数的调用顺序仅与子对象在类中声明的顺序有关,而与成员初始化列表中给出的对构造函数的调用顺序无关 构造函数的成员初始化列表中未给出对子对象的调用,则表示使用子对象的缺省构造函数 3.9 堆对象 在程序运行过程中根据需要可以随时建立或删除的对象...A[5]; 使用new创建对象数组或一般数组时,不能为该数组指定初始值,其初始值为缺省值 使用new[]创建对象数组时,类中必须说明缺省构造函数 3.9.3 delete运算符 删除用new创建的对象或一般类型的指针
capacity 返回在不分配更多的内存的情况下vector可以包含的元素数。(当前内存空间) cbegin 返回指向vector中起始位置的常量迭代器。...> name{value, value...}; std::array name = {value, value...}; 成员函数: 名称 说明 array 构造一个数组对象...value_comp 返回用于在value_type类型的对象中比较键的函数。 运算符: 名称 说明 operator= 将一个集中的元素替换为另一个集的副本。...哈希函数将此序列分区到称为存储桶的有序序列集中。 在每个存储桶中,比较函数将确定任一元素对是否具有等效顺序。 每个元素存储两个对象,包括一个排序键和一个值。...非成员辅助函数: 名称 说明 make_tuple 创建一个tuple对象,其类型根据各实参类型定义 tie 创建左值引用的tuple,或将 tuple 解包为独立对象 forward_as_tuple
,静态类中只能包含静态成员(被static修饰的字段、属性、方法),不能被实例化,不能被继承;非静态中可以包含静态成员。 ...(2)被调用类为静态类: public static class ClassA //ClassA类(静态类) { //当然静态类中不能存在构造函数...(); //调用ClassA类中的方法直接调用:类名.成员 } } 说明:ClassA类为静态类,其中的方法也Fun()为非静态方法,所以在ClassB中调用时不实例化...当含有静态成员的非静态类实例化出对象后,这些对象公用这些静态成员,通过类名或对象名都能访问它们。 在网上看到两个有趣的小例子: 人是一个非静态类。...所以,方法内部的静态变量,执行完静态变量值不消失,再次执行此对象的方法时,值仍存在,它不是在堆和栈中分配的,是在静态区非配的, 这是与局部变量最大的区别。
对象的创建过程 当虚拟机遇到一条含有new的指令时,会进行一系列对象创建的操作: 检查常量池中是否有即将要创建的这个对象所属的类的符号引用; 若常量池中没有这个类的符号引用,说明这个类还没有被定义...为对象中的成员变量赋上初始值(默认初始化); 设置对象头中的信息; 调用对象的构造函数进行初始化 此时,整个对象的创建过程就完成了。...对象的内存模型 一个对象从逻辑角度看,它由成员变量和成员函数构成,从物理角度来看,对象是存储在堆中的一串二进制数,这串二进制数的组织结构如下。...此外,对象头中可能还包含类型指针。通过该指针能确定这个对象所属哪个类。 此外,如果对象是一个数组,那么对象头中还要包含数组长度。 2....实例数据 实力数据部分就是成员变量的值,其中包含父类的成员变量和本类的成员变量。 3. 对齐补充 用于确保对象的总长度为8字节的整数倍。 HotSpot要求对象的总长度必须是8字节的整数倍。
对于某些类,合成的默认构造函数可能执行错误的操作:如果定义在块中的内置类型或符合类型(比如数组和指针)的对象被默认初始化,则它们的值可能是未定义的。...编译器可能不能为某些类合成默认的构造函数:如果类中包含一个其他类类型的成员并且这个成员的类型没有默认构造函数,那么编译器无法初始化该成员。...拷贝:初始化变量;以值的方式传递或返回一个对象 赋值:使用了赋值运算符 销毁:当对象不再存在时执行的操作,比如一个局部对象会在创建它的块结束时销毁,当vector对象或数组销毁时存储在其中的对象也会被销毁...默认初始化的发生条件: 我们在块作用域中不使用任何初始值定义一个非静态变量或者数组时 当一个类本身含有类类型的成员且使用合成的默认构造函数时 当类类型的成员没有在构造函数初始值列表中显式地初始化时 值初始化的发生条件...: 在数组初始化的过程如果我们提供的初始值数量少于数组的大小时 当我们不使用初始值定义一个局部静态变量时 当我们书写形如T()的表达式显式地请求值初始化时,其中T是类型名 聚合类 聚合类使得用户可以直接访问其成员
new产生的数据 ◆静态域:存放在对象中用static定义的静态成员 ◆常量池:存放常量 ◆非RAM存储:硬盘等永久存储空间 Java内存分配中的栈 在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配...Java内存分配中的堆 堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。 ...而数组和对象本身在堆中分配,即使程序 运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍...day,month,year为成员变量,它们存储在堆中(new BirthDate()里面)。当BirthDate构造方法执行完之后,d,m,y将从栈中消失。...除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用,比如: ◆类和接口的全限定名; ◆字段的名称和描述符
== 为类提供构造函数 类包含调用以从类蓝图创建对象的构造函数。构造函数声明看起来像方法声明,只是它们使用类的名称并且没有返回类型。...可以在构造函数声明中使用访问修饰符来控制哪些其他类可以调用构造函数。 ==注意:如果另一个类不能调用MyClass构造函数,则不能直接创建MyClass对象。...要引用点字段x,构造函数必须使用this.x。 将this与构造函数一起使用 在构造函数中,还可以使用this关键字调用同一类中的另一个构造函数。这样做称为显式构造函数调用。...如果初始化需要一些逻辑(例如错误处理或用于填充复杂数组的for循环),简单的作业是不够的。实例变量可以在构造函数中初始化,其中可以使用错误处理或其他逻辑。...该方法是final的,因为在实例初始化期间调用非final方法可能会导致问题。 创建和使用类和对象概述 类声明命名类,并将类体括在大括号之间。类名前面可以有修饰符。类主体包含类的字段、方法和构造函数。
自定义的构造函数 拷贝构造函数 深浅拷贝。 调用时机——函数传参,不是引用方式。函数返回类型是类,而且不是引用类型。对象数组的初始化列表中,使用对象。...对象可以直接访问静态成员函数。 在类的静态成员函数内部不能直接访问this指针和对象的数据成员。 只能访问类的静态数据成员。...---- 继承方式的不同,影响外部通过子类访问父类成员。 ---- 调用父类的构造函数: 在子类的构造函数中 ,显式调用父类的构造函数。...---- 调用顺序: 静态类数据成员的构造函数——》父类的构造函数——》非静态数据成员的构造函数——》自己的构造函数。 (类的静态成员)静态对象只创建一次。(构造函数、析构函数只执行一次。)...---- frend class 这个类都是友元,这里面的所有成员函数都可以访问另一个类里面的私有成员。 就相当与把这个类里面的所有成员函数都声明为另一个类的友元函数。
顺便提一下,类类型包括包含类类型分量的构造类型不能作为文件类型的基类型。...三:类类型的字段 类类型中的字段也就是类的数据部分,其声明方法同记录中字段的声明语法相似: 标识符:类型 其中字段的类型可以是各种数据类型,甚至是另一个类类型。...注意:尤其是熟悉C++的程序员要注意,在C++中,当您用一个类类型声明一个对象时,将自动调 用类的构造函数(这也是C++中一般不需要显式调用构造函数的原因),而在object Pascal中,当您声 明了一个类类型的变量...不过这时候不会再在堆中分配一块 区域,也不执行缺省初始化工作,更不返回一个新的对象实例,它只是执行构造中指定的动作。...它是由多个类型的值组成的,其中每个值都有一个索引号, 不过跟一般的数组不同的是,一般的数组是个构造类型,您可以把数组作为一个整体参与运算如赋值或 传递等,而对数组属性来说,只能访问其中的每一个元素。
类的实例和对象含义相同。 2. 对象之间的包含关系:一个类包含另外一个类。这类似于继承关系,但包含类可以控制对被包含类的成员的访问,甚至在使用被包含类的成员进行其他处理。 3....对象之间的集合关系:一个类用作另一个类的多个实例的容器。这类似于对象数组,但集合有其他功能,包括索引、排序和重新设置大小。 4. 值类型:在内存的一个地方存储它们自己和它们的内容 5....只有string和object简单类型是引用类型,但是数组也是隐式的引用类型。 8. 类的修饰符 image.png 9. 接口和抽象类的相似之处: 它们都包含可以由派生类继承的成员。...另外,按照定义,接口成员是公共的(因为它们倾向于在外使用),但抽象类的成员可以是私有的(只要它们不是抽象的)、受保护的、内部的或受保护的内部成员(其中受保护的内部成员只能在应用程序的代码或派生类中访问)...此外,接口不能包含字段、构造函数、析构函数、静态成员或常量。 image.png
C++编译器必须为每一个多态类至少创建一个虚函数表,它其实就是一个函数指针数组,其中存放着这个类所有的虚函数的地址及该类的类型信息,其中也包括那些继承但未改写的虚函数。...多态数组 在基类对象数组中存放派生类对象 Shape a(Point(1,1)); Circle b(Point(2,2),5); Rectangle c(Point(3,3),...只有虚函数访问需要经过vfptr的间接寻址,增加了一层间接性,因此带来了一些额外的运行时开销 隐含成员 一个C++的复合类型对象,其可能的隐含成员包含:若干vfptr,默认构造函数,默认拷贝构造函数...该类的继承链中至少有一个基类是多态类该类至少有一个虚基类该类包含了多态的成员对象,但是该类不一定是多态类 显然,当创建一个对象的时候,其隐含的成员vfptr必须被初始化为指向正确的vtable,而且这个初始化工作只能在运行时完成... 用构造函数确保初始化 如果一个类有构造函数,那么编译器在创建对象时就自动调用这个函数。
这个内容在面试中也有可能会出现。 final使用 final变量 final变量有成员变量或者是本地变量(方法内的局部变量),在类成员中final经常和static一起使用,作为类常量使用。...其中类常量必须在声明时初始化,final成员常量可以在构造函数初始化。...这样的话,就解决了数组在外部被修改的不安全性,但也产生了另一个问题,那就是这个数组要被外部使用的。...对于引用类型,写 final 域的重排序规则对编译器和处理器增加了如下约束: 在构造函数内对一个 final 引用的对象的成员域的写入,与随后在构造函数外把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序...JMM 可以确保读线程 C 至少能看到写线程 A 在构造函数中对 final 引用对象的成员域的写入。即 C 至少能看到数组下标 0 的值为 1。
领取专属 10元无门槛券
手把手带您无忧上云