初始化列表

对象创建的过程

混江龙づ霸主 提交于 2020-04-06 06:21:24
通过符号引用定位到类是否被加载。没有就加载类。执行类加载与验证的过程 分配内存:类的准备阶段。类加载完成后就能确定对象分配多少内存。如果虚拟机具有 Compact 压缩功能(标记整理),就是用 指针碰撞 (记录头尾位置);如果只有 标记清理 的虚拟机,就是用 空闲列表 。 分配内存的方式: CAS 与 TLAB 两种。如果多线程并发创建,需要考虑同步问题(多个对象指向一个地方)。 CAS:一般使用 CAS 和失败重试保证原子性。 TLAB :按照线程分配不同空间(本地线程分配缓冲),只有 TLAB 用完,需要分配新的才需要同步。是否使用该方式通过参数指定 解析,符号引用替代成直接引用 初始化 分配到的内存初始化为零(除了对象头)。这就是对象属性不需要初始化可以直接使用 设置对象头:什么类的对象,元数据,哈希码,对象GC分代年龄等信息。根据虚拟机运行状态,判断是否启用偏向锁 执行初始化方法:<init>。按照程序员指定的初始化过程初始化对象。这里就是执行初始化的过程 父类的静态初始化块 本类的静态初始化块 父类的初始化块 父类的构造方法 本类初始化块 本类的构造方法 来源: oschina 链接: https://my.oschina.net/u/3870422/blog/3220397

C++构造函数初始化列表

ぃ、小莉子 提交于 2020-03-28 07:11:19
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。 例如: Example::Example() : ival(0), dval(0.0) {} //ival 和dval是类的两个数据成员 上面的例子和下面不用初始化列表的构造函数看似没什么区别: Example::Example() { ival = 0; dval = 0.0; } 的确,这两个构造函数的结果是一样的。但区别在于:上面的构造函数(使用初始化列表的构造函数) 显示的初始化类的成员 ;而没使用初始化列表的构造函数是 对类的成员赋值 , 并没有进行显示的初始化 。 初始化和赋值对 内置类型的成员 没有什么大的区别 ,像上面的任一个构造函数都可以。但 有的时候必须用带有初始化列表的构造函数 : (1) 成员类型是没有默认构造函数的类 。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。 (2) const 成员或引用类型的成员 。因为const对象或引用类型只能初始化,不能对他们赋值。 C++在类的构造函数中,可以两种方式初始化成员数据(data member)。 1,在构造函数的实现中,初始类的成员数据。诸如: class point { private: int x,y; public

const、static关键字

旧巷老猫 提交于 2020-03-20 08:02:34
3 月,跳不动了?>>> 最近一直在迷惑着这两个关键字,感觉大脑里一片糊涂,特此整理一下: 一、const 1、数据常量,不能修改,必须初始化; 1)非类的数据成员 a、指向const对象的指针(remember) b、const指针(remember) 2)作为类的数据成员 a、必须在构造函数中进行初始化,并且必须在初始化列表中进行初始化; 引申:必须对任何const或引用类型成员以及没有默认构造函数的类类型的额任何成员使用初始化式; 2、const成员函数 作为类的const成员函数,const关键字放在函数声明的后面,在函数定义时,也必须将const关键字放在函数的后面(对于static不是这样)。 1)设计const成员函数主要是不改变对象,正因为这样一个const成员函数不可能再声明为static,因为static加在成员函数上就表明该函数属于类而不属于类对象; 2)const成员函数可以被const对象或者非const对象调用,当被const对象调用时,函数中的this指针就变成了一个指向const对象的const指针(因为this指针本书就是一个const指针,它就是指向调用该函数的对象); 二、static 静态的; 1、对于对象进行修饰 1)对于全局变量加上static关键字后其存储位置没有变,还是在全局存储区,但是缩小了其作用域,生命周期也没有变; 2

通过初始化列表初始的情况

邮差的信 提交于 2020-03-18 11:22:19
在构造函数中,以下几类的成员变量必须用初始化列表初始化: 1、类成员为const类型或引用类型 2、类成员为没有默认构造函数的类 3、在继承关系中,派生类必须在其初始化列表中调用基类的构造函数 原因是,const对象或引用只能初始化而不能赋值。构造函数的函数体内只能赋值而不能初始化,因此初始化const对象或引用只能在构造函数之前的初始化列表中初始化。 来源: 51CTO 作者: wx5cb188ffabeef 链接: https://blog.51cto.com/14289397/2479590

读书笔记 串口

旧城冷巷雨未停 提交于 2020-03-16 17:52:27
1,51 C语言中数据类型加关键字 code 会被存在flash ,不加会被存在SDRAM。 2,数组不初始化会随机分配一个地址,数组的值 为原地址存储的值。 3,c不支持把数组当做一个整体来赋值,也不支持用花括号列表进行赋值,初始化是可以的啊。 来源: https://www.cnblogs.com/321waiting/p/12505205.html

拷贝、赋值与销毁

我只是一个虾纸丫 提交于 2020-03-15 12:21:09
一个类的拷贝控制操作包含: 拷贝构造函数 拷贝赋值运算符 移动构造函数 移动赋值运算符 析构函数 其中: 拷贝和移动构造函数定义了当用同类型的另一个对象初始化本对象时的操作。 拷贝和移动赋值运算符定义了将一个对象赋予同类型的另一个对象时的操作。 析构函数定义了当此类型对象销毁时的操作。 如果一个类没有定义所有这些拷贝控制成员,编译器会自动为它定义缺省的操作。对一些类来说,依赖于这些操作的默认定义会导致灾难。 拷贝构造函数 如果一个构造函数的第一个参数是自身类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数: class Foo{ public: Foo(); //默认构造函数 Foo(const Foo&); //拷贝构造函数 }; 拷贝构造函数的第一个参数必须是引用类型。 虽然可以定义一个接受非 const 引用的拷贝构造函数,但是此参数几乎总是 const 的。 拷贝构造函数在一些情况下会隐式使用,因此拷贝构造函数通常不定义成 explicit 。 合成拷贝构造函数 如果没有自定义拷贝构造函数,编译器会自动生成一个,与合成默认构造函数不同,即使定义了其他构造函数,编译器也会合成一个拷贝构造函数。 一般情况,合成的拷贝构造函数会从给定对象中依次将每个非 static 成员拷贝到正在创建的对象中,每个成员的类型决定了如何拷贝: 对类类型的成员

点读系列《Java编程思想 前6章》

好久不见. 提交于 2020-03-15 09:50:21
第1章 对象导论 计算机是头脑延伸的工具。 所有编程语言都提供抽象机制。 每个对象看起来都有点像一台微型计算机。 每个对象在内存中都有一个唯一的地址。 每个对象都有一个接口。 向对象发送消息。 每个对象都提供服务。 每个对象都可以很好地完成一项任务,但是它并不试图做更多的事。 public 任何人都是可用的。 private 除类型创建者和类型的内部方法之外的任何人都不能访问。 protected 与private作用相当,差别仅在于继承的类可以访问protected成员。 Java的默认访问权限:包访问权限,类可以访问在同一个包中的其他类的成员。 代码复用是面向对象程序设计语言所提供的最了不起的优点之一,复用某个类的最简单方式就是直接使用该类的一个对象。 在建立新类时,应该首先考虑组合(将一个类的对象置于新类中),而不是盲目的继承。 类与基类具有相同的类型。 通过继承而产生的类型等价性是理解面向对象程序设计方法内涵的重要门槛。 Java以extends关键字表示继承。 把一个对象不当做它所属的特定类型来看待,而是将其当做其基类的对象来对待。这样的代码不会受添加新类型的影响的。 通过导出新的子类型而轻松扩展设计的能力是对改进进行封装的基本方式之一。 编译器不可能产生传统意义上的函数调用。 在OOP中,程序直到运行时才能够确定代码的地址,这叫做后期绑定

直接初始化、拷贝初始化

随声附和 提交于 2020-03-14 18:46:02
1.直接初始化 1)直接初始化实际上是要求编译器选择 参数最匹配 的一般构造函数 2.拷贝初始化 1)拷贝初始化实际上时要求编译器将 右侧运算对象 拷贝到正在创建的对象中, 如有需要,还要进行类型转换 2)拷贝初始化通常使用拷贝构造函数来完成 3)拷贝初始化发生时机: 用等号"=" 定义 变量时(注意定义二字,不是定义的时候使用等号是调用拷贝赋值运算符) 将一个对象作为实参传递给一个非引用的形参 从一个返回类型为非引用类型的函数中返回一个对象 用花括号列表初始化数组元素或者一个聚合类中的成员(因为也用到了等号"="定义变量) 3)编译器可以“绕过”拷贝构造函数:即编译器有时 可以 进行优化( 但不是必须 ),跳过拷贝构造函数,直接使用转换构造函数构造对象 string s = "666"; //先调用转换构造函数来构造一个临时的string对象(内容为:666),再调用拷贝构造函数用这个临时对象来构造s 编译器可以优化为: string s("666"); //直接调用转换构造函数来构造对象 来源: https://www.cnblogs.com/Joezzz/p/9717699.html

第一篇博客 C+++知识点总结一

眉间皱痕 提交于 2020-03-12 11:58:32
1.成员 1.比较特殊的成员类型:protected. 保护成员在本类中和private类型的成员作用一模一样。区别在于保护成员可以由本类的派生类的成员函数访问,但是私有成员在其派生类中无法访问。 2.成员函数的定义 成员函数如果在类外定义,那么函数声明的参数表可以只写参数类型,但是在类外定义时必须给出参数名。 3.内联成员函数 (1)隐式定义内联成员函数 直接在类内定义的成员函数 (2)显式定义内联成员函数 用关键字inline声明(在声明和定义的语句句子开头加inline),此时可以在类内声明,类外定义。声明、定义都要在句首加inline. (3)内联函数 内联函数的代码会在编译时插入到每一个调用它的地方。这种做法会提高运行效率。但是只有很简短的代码才实用。 2.对象(成员访问,初始化方式) 1.对象成员的访问方式: 例如对对象d中成员year的访问 d.year (*p).year p->year 2.对象的初始化 (1) class complex { public: double real; //数据成员是public时才能使用这种方法 double imag; }; complex c={1.1,2.2}; (2)用构造函数(作用:为对象分配空间,进行初始化) 例如: ... class complex { public: complex(int a,int b)

Effective C++ 学习笔记

别等时光非礼了梦想. 提交于 2020-03-08 13:46:07
1. 基础部分 Item 1: View C++ as a federation of languages. 对于内建类型,按值传递优于按引用传递,对于自定义类型则相反。 C++可视为4中子语言的联合:C,Object-Oriented C++,Template C++和STL。 Item 2: Prefer consts, enums, and inlines to #defines. 只有整型常量可以在类声明里面初始化: class Klass { const static int num = 1 ; //也可只声明,在定义文件中,即类外部定义、初始化; }; enum类型也可以在类内部初始化。 Item 3: Use const whenever possible. 对于指针p,const在 * 左边时,p指向的值为常量,const出现在 * 右边时,p指向的地址为常量。 const int * p1 ; int const * p2 ; int * const p3 ; ​ //以上代码,p1和p2一样,其指向的值为常量;p3指向的地址为常量 如果类Klass有同名的两个成员函数foo,其中一个为const类型,那么const实列优先调用const版的foo。 const函数不能改变非static的成员变量。 mutable修饰的成员,在const函数中也可以改变其值。