初始化列表

构造、析构、拷贝语意学

守給你的承諾、 提交于 2020-01-07 16:53:17
  对于abstract base class(抽象基类),class中的data member应该被初始化,并且只在constructor中或者在其他member functions中指定初值 纯虚函数的存在   纯虚函数的意义在于只定义一个可继承的接口,并没有实现(虚函数意义在于定义一个可继承的接口并且有一份缺省实现,普通的成员函数意义在于定义一个可继承的接口并且有一份强制实现)   纯虚函数不能经由虚拟机制调用,但是可以被静态地调用(invoked statically, AbsractClassName::pureFunction() )   对于pure virtual destructor,一定要定义它,因为每一个derived class destructor会被编译器加以扩张,以静态调用的方式调用其”每一个virtual base class”以及”上一层base class”的destructor,因此只要缺乏何一个base class destructor的定义,就会导致链接失败。   编译器不会合成一个pure virtual destructor的函数定义。   一个较好的替代方案就是:不要把virtual destructor声明成pure 虚拟规格的存在   一个函数几乎不会被后继的derived class改写,而且是inline函数

S4_数组的初始化

徘徊边缘 提交于 2020-01-07 11:15:37
在定义数组的同时,设置数组内的元素值。 int a[8] = {20, 5, 30, 13, 18}; printf("%d,%d,%d,%d,%d\n", a[0],a[1],a[2],a[3],a[4]); 或者 cout << a[0] << “,” << a[1] << “,” << a[2] << “,” << a[3] << “,” << a[4]; int a[8] = {0}; // 把数组的所有元素都初始化为 0 printf("%d,%d,%d,%d,%d\n", a[0],a[1],a[2],a[3],a[4]); int a[8] = {1}; // 把 a[0] 初始化为 1 ,其它值都初始化为 0 int b[8] = {1, 5}; // 把 a[0] 初始化为 1 , a[1] 初始化为 5 ,其它值都初始化为 0 int a[] = {1,2,5}; // 定义数组 a, 这个数组包含 3 个元素! // 根据“初始化列表”,自动计算数组的容量 高逼格用法(在某些特殊场合使用) 优点:但数组的成员较多时,该方式可读性高 缺点:仅仅 C 编译器支持, C++ 编译器中不支持,即 C++ 程序中不能使用。 // 每周的锻炼时间: int exercises[7] = { [1] = 1, //a[1] = 1 [3] = 2, //a[3] = 2 /

C数组&结构体&联合体快速初始化

柔情痞子 提交于 2020-01-07 08:27:47
C语言数组的初始化表示方法 一、C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值。如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始化后,a[0]=0,a[1]=1,… ,a[9]=9。 (2)初始化时可以只对一部分元素赋初值。例如: static int a[10]={0,1,2,3,4}; 定义的数组有10个元素,但只对其中前5个元素赋了初值,后5个元素初值为0。 (3)将数组的元素值全部为0,可以用下面的方法:(方法一) int a[5] = {0}; // 将整型数组a的每个元素都初始化为0 或者也可以用如下方法进行初始化:(方法二) int a[5] = {0, 0, 0, 0, 0}; // 初始化效果同上 不能用: static int a[10]={0*10}; 如果对static型数组不赋初值,系统会对定义的所有数组元素自动赋以0值。 (4)在对全部数组元素赋初值时,可以不指定数组长度。 int a[]={0,1,2,3,4}; 相当于 int a[5]={0,1,2,3,4}; 二、C语言二维数组初始化: 声明时给初始值叫初始化。例如:int b[3][4]={1,2,3,4,5,6,7,8,4,4,4,4}; 声明后赋值,可以用赋值语句, b[0][0]=1; b[0][1]=2; b[0]

JVM创建对象的过程

走远了吗. 提交于 2020-01-07 01:47:36
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1、类加载检查,当虚拟机遇到一条new指令的时候,首先去检查这个指令的参数能否在常量池定位到这个类的符合引用,并且检查这个类的符号引用是否已经被加载过,【如果没有则进行类的加载】 2、分配内存:其中如果有指针碰撞和空闲列表两张创建方式。 3、初始化零值,不包括对象头的设置。 4、设置对象头,其中包括类的元数据信息,hash值,GC age等信息,其中还会根据当前虚拟机运行状态的不同,标志是否启用偏向锁等。 5、执行init方法,进行值的初始化,方法的加载。 来源: oschina 链接: https://my.oschina.net/u/2870118/blog/3151572

C/C++ 复习

末鹿安然 提交于 2020-01-05 04:23:10
本文总结一下C++面试时常遇到的问题。C++面试中,主要涉及的考点有 关键字极其用法,常考的关键字有const, sizeof, typedef, inline, static, extern, new, delete等等 语法问题 类型转换 指针以及指针和引用的区别 面向对象的相关问题,如虚函数机制等 泛型编程的相关问题,如模板和函数的区别等 内存管理,如字节对齐(内存对齐)、动态内存管理、内存泄漏等 编译和链接 实现函数和类 本文不涉及STL的内容,有关STL的内容,会另有一篇文章专门总结。 零、序章 0.1 C++与C的对比 C++有三种编程方式:过程性,面向对象,泛型编程。 C++函数符号由 函数名+参数类型 组成,C只有函数名。所以,C没有函数重载的概念。 C++ 在 C的基础上增加了封装、继承、多态的概念 C++增加了泛型编程 C++增加了异常处理,C没有异常处理 C++增加了bool型 C++允许无名的函数形参(如果这个形参没有被用到的话) C允许main函数调用自己 C++支持默认参数,C不支持 C语言中,局部变量必须在函数开头定义,不允许类似for(int a = 0; ;;)这种定义方法。 C++增加了引用 C允许变长数组,C++不允许 C中函数原型可选,C++中在调用之前必须声明函数原型 C++增加了STL标准模板库来支持数据结构和算法 一

Java学习入门06

徘徊边缘 提交于 2020-01-04 00:48:33
方法概述 方法: 就是将一个 功能 抽取出来,把代码单独定义在一个大括号内,形成一个单独的功能。 当我们需要这个功能的时候,就可以去调用。这样即实现了代码的复用性,也解决了代码冗余的现象。(方法就是完成特定功能的代码块) 方法的定义 定义格式: 修饰符 返回值类型 方法名 (参数列表){ 代码(方法体)... return ; } 定义格式解释: 修饰符 :目前固定写法 public static 返回值类型 用于限定返回值的数据类型 方法名 一个名称,为了方便我们调用方法 参数类型 限定调用方法时传入参数的数据类型 参数名 是一个变量,接收调用方法时传入的参数 方法体 完成功能的代码 return 结束方法以及返回方法指定类型的值 返回值 程序被return带回的结果,返回给调用者 有明确返回值的方法调用: 单独调用,没有意义 输出调用,有意义,但是不够好,因为我不一定非要把结果输出 赋值调用,推荐方式 方法定义注意事项 : 方法不调用不执行 方法与方法是平级关系,不能嵌套定义 方法定义的时候参数之间用逗号隔开 方法调用的时候不用在传递数据类型 如果方法有明确的返回值,一定要有return带回一个值 没有明确返回值的函数调用 其实就是void类型方法的调用 只能单独调用 方法重载概述 在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可 方法重载的特点

初始化列表,初始化构造函数参数。

匆匆过客 提交于 2020-01-03 00:55:01
看 struct Edge { int v, w; Edge(int v = -1, int w = -1) : v(v), w(w) { } }; Edge(int v = -1, int w = -1) : v(v), w(w) { } 这一句什么意思呢???见过几次了,只晓得是类似初始化的东西。到底是什么回事呢??? 显然,冒号后面要对数据成员的构造函数进行调用。就是成员初始化列表,用来初始化构造函数的参数。如果调用的是v( )和w( )就是调用默认构造函数,可以省略,那么就是常见的那种构造函数了哦! 上面的结构体的构造函数中初始化列表中调用的是默认构造函数的话,就变为下面的形式: Edge(int v=-1,int w=-1){ } 成员的构造函数在类本身构造函数执行前先被执行,构造函数按照成员在类中的声明顺序执行,不是按照成员在初始化列表中出现的顺序执行。在类本身的析构函数执行之后,按照与构造函数相反的顺序进行析构。 冒号语法使得常量成员和引用成员初始化成为可能。因为常量成员是不能赋值的,一旦初始化以后就不能改变。初始化以后值就固定不变了,在初始化以后不可以有赋值语句出现。引用成员也是不可以重新制定引用对象的。 参考:Bjarne Stroustrup.The C++ Programming Language .Special Edition 钱能.C++程序设计教程

java 构造器学习笔记

自作多情 提交于 2020-01-02 00:38:19
构造器(构造器不是方法也不是类的成员) 以前创建对象的方式, public class Constructor{ public static void main(String[] args){ person p = new Persen(); p.name = "李四“ p.age = 15 Person p2 = new Person(); p2 = "王五”; p.age = 16; public class Persen{ String name; int age; } } 1 每创建一个对象,都需要进行初始化。 2 创建于初始化是分离操作,这可能会导致创建对象后,忘记初始化。 构造器的声明 构造器名字与类名相同,并且没有返类型(没有返回类型与返回类型为void不同),访问权限与参数列表与普通方法相同,没有限制。 构造器会在new创建对象时执行(调用),每创建一个对象,构造器都会执行一次。 class Person{ String name; int age; publice Person()//构造器 { System.out.println("我执行了"); } } 通过含有参数的构造器可以实现更加灵活地实现初始化。 默认的构造器 如果我们现实的声明任何构造器。则编译器会自动的为我们生成一个构造器。默认的构造器访问权限与类的访问权限相同,参数列表为空。

实验三 类与对象

时光总嘲笑我的痴心妄想 提交于 2020-01-02 00:32:16
四、实验结论 验证性实验部分 总结你对类、对象、构造函数、复制构造函数、析构函数的认识、理解和思考。 类与对象: 对象是对客观事物的抽象,类是对对象的抽象。 (1)类类型的声明: class 类名 { public: 公用的数据和成员函数 protected: 保护的数据和成员函数 private: 私有的数据和成员函数 } (2)什么是构造函数? 通俗的讲,在类中,函数名和类名相同的函数称为构造函数。它的作用是在建立一个对象时,作某些初始化的工作(例如对数据赋予初值)。C++允许同名函数,也就允许在一个类中有多个构造函数。如果一个都没有,编译器将为该类产生一个默认的构造函数。此默认构造函数的功能是为对象分配内存,但无法为成员数据赋初值。 构造函数上惟一的语法限制是它不能指定返回类型,甚至void 也不行。 用于在创建对象时为对象分配内存 ,并可以将其初始化到特定的状态。 1,不带参数的构造函数:一般形式为: 类名 对象名(){函数体} 2,带参数的构造函数:不带参数的构造函数,只能以固定不变的值初始化对象。带参数构造函数的初始化要灵活的多,通过传递给构造函数的参数,可以赋予对象不同的初始值。 一般形式为:构造函数名(形参表); 创建对象使用时:类名 对象名(实参表); 如果类中没有写构造函数,编译器会自动生成一个隐含的默认构造函数,该函数是个空值。 小结: 构造函数的重载

SpringMVC源码(七)- doDispatch - RequestMappingHandlerAdapter的handle(方法的调用)

你说的曾经没有我的故事 提交于 2020-01-01 05:01:38
目录 一、RequestMappingHandlerAdapter结构 1、完成ControllerAdvice注解相关初始化 2、各种类型的解析器站初始化 1)、argumentResolvers 初始化: 2)、initBinderArgumentResolvers(数据绑定解析器列表)初始化: 3)、returnValueHandlers 初始化: 二、RequestMappingHandlerAdapter的handle方法 1、invokeHandlerMethod 2、invokeForRequest(调用真实请求方法) 1)、getMethodArgumentValues(参数解析) 2)、doInvoke(真正的Controller方法调用) 3、handleReturnValue(解析方法调用的结果) 总结 一、RequestMappingHandlerAdapter结构 从层级结构看,主要实现了BeanFactoryAware、ApplicationContextAware、HandlerAdapter和InitializingBean。其他回调方法都是常规赋值,主要准备工作在 afterPropertiesSet 回调方法中完成。 @Override public void afterPropertiesSet() { // Do this first, it