初始化列表

20190818 On Java8 第八章 复用

微笑、不失礼 提交于 2019-11-27 18:09:39
第八章 复用 组合语法 初始化引用有四种方法: 当对象被定义时。这意味着它们总是在调用构造函数之前初始化。 在该类的构造函数中。 在实际使用对象之前。这通常称为延迟初始化。在对象创建开销大且不需要每次都创建对象的情况下,它可以减少开销。 使用实例初始化。 继承语法 初始化基类 Java 自动在派生类构造函数中插入对基类构造函数的调用。 构造从基类“向外”进行,因此基类在派生类构造函数能够访问它之前进行初始化。即使不为 Cartoon 创建构造函数,编译器也会为你合成一个无参数构造函数,调用基类构造函数。 先调用基类构造器,从最基类向外层层调用。 带参数的构造函数 对基类构造函数的调用必须是派生类构造函数中的第一个操作。 委托 Java不直接支持的第三种重用关系称为委托。这介于继承和组合之间,因为你将一个成员对象放在正在构建的类中(比如组合),但同时又在新类中公开来自成员对象的所有方法(比如继承)。 结合组合与继承 保证适当的清理 在清理方法 中,还必须注意基类和成员对象清理方法的调用顺序,以防一个子对象依赖于另一个子对象。首先, 按与创建的相反顺序执行特定于类的所有清理工作 。(一般来说,这要求基类元素仍然是可访问的。) 然后调用基类清理方法。 组合与继承的选择 当你想在新类中包含一个已有类的功能时,使用组合,而非继承。 当使用继承时,使用一个现有类并开发出它的新版本

[转]C++初始化和赋值的区别

巧了我就是萌 提交于 2019-11-27 16:07:34
1. C++中, 对于简单类型的赋值和初始化的区别基本可以忽略 2. 当涉及到类或者复杂的数据类型时,问题就变得不那么简单了,下面以一个例子来引入话题: #include <iostream> using namespace std; class Point { public: Point(int a=0, int b=0):x(a), y(b){}; ~Point(){ }; Point& operator =(const Point &rhs); int x; int y; }; Point& Point::operator =(const Point &rhs) { x = rhs.x+1; y = rhs.y+1; return *this; } int main(void) { Point p(1,1); Point p1 = p; //初始化操作 Point p2; p2 = p; //赋值操作 cout<<"p1.x = "<<p1.x<<" "<<"p1.y="<<p1.y<<endl; cout<<"p2.x = "<<p2.x<<" "<<"p2.y="<<p2.y<<endl; return 0; } 运行结果如下: 可以看到赋值操作和初始化操作打印的结果,只在赋值操作中调用了重载“=”的函数。 而在初始化中的“=”调用的是默认的构造函数 为了证实初始化中的“

C++ 初始化列表

做~自己de王妃 提交于 2019-11-27 15:50:04
何谓初始化列表 与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。在C++中,struct和class的唯一区别是默认的访问性不同,而这里我们不考虑访问性的问题,所以下面的代码都以struct来演示。 struct foo { string name ; int id ; foo(string s, int i):name(s), id(i){} ; // 初始化列表 }; /*--> */ /*--> */ 构造函数的两个执行阶段 构造函数的执行可以分成两个阶段,初始化阶段和计算阶段,初始化阶段先于计算阶段。 初始化阶段 所有类类型(class type)的成员都会在初始化阶段初始化,即使该成员没有出现在构造函数的初始化列表中。 计算阶段 一般用于执行构造函数体内的赋值操作,下面的代码定义两个结构体,其中Test1有构造函数,拷贝构造函数及赋值运算符,为的是方便查看结果。Test2是个测试类,它以Test1的对象为成员,我们看一下Test2的构造函数是怎么样执行的。 struct Test1 { Test1() // 无参构造函数 { cout << "Construct Test1" << endl ; } Test1(const Test1& t1) // 拷贝构造函数 { cout <<

C++ 对象初始化和赋值

百般思念 提交于 2019-11-27 15:49:56
1.区分初始化和赋值 在C++中,当一个新对象被创建时,会有初始化操作;而赋值是修改一个已经存在的对象的值。 初始化操作由构造函数完成,而赋值操作由operator=操作符函数完成。如果程序员没有提供构造函数和operator=操作符函数,那么编译器会提供缺省版本,使用缺省构造函数或缺省复制构造函数初始化对象,使用缺省operator=操作符函数执行赋值操作。举例如下: View Code /** * @file Main.cpp */ #include <iostream> using std::cout; using std::endl; class CDummy { public: CDummy(void); CDummy(const CDummy& dummy); CDummy& operator=(const CDummy& dummy); }; CDummy::CDummy() { cout << "无参构造" << endl; } CDummy::CDummy(const CDummy& /*dummy*/) { cout << "复制构造" << endl; } CDummy& CDummy::operator=(const CDummy& /*dummy*/) { cout << "赋值操作" << endl; return *this; } int main

C++中的对象初始化

你说的曾经没有我的故事 提交于 2019-11-27 15:49:41
总所周知,C++对象在创建之时,会由构造函数进行一系列的初始化工作。以没有继承关系的单个类来看,除了构造函数本身的产生与指定,还涉及到初始化步骤,以及成员初始化方式等一些细节,本篇笔记主要对这些细节进行介绍,弄清C++对象在初始化过程中一些基本运行规则。 构造函数指定 通常,我们在设计一个类的时候,会为这个类编写对应的default constructor、copy constructor、copy assignment operator,还有一个deconstructor。即便我们仅仅编写一个空类,编译器在编译时仍旧会为其默认声明一个default constructor、copy constructor、copy assignment operator与deconstructor,如果在代码里面存在着它们的使用场景,那么这个时候编译器才会创建它们。 1 class MyCppClass 2 { 3 } 一旦我们为一个类编写了default constructor,那么编译器也就不会为其默认生成default constructor,对于其他几个函数也一样。对于编译器默认生成的constructor来说,它会以一定规则对每一个数据成员进行初始化。考虑到成员初始化的重要性,在编写自己的constructor时就需要严谨认真了,特别是在类的派生与继承情况下这点显得尤为重要

JAVA 基础

旧街凉风 提交于 2019-11-27 11:37:02
1. Java数据类型 Java是强类型语言,所有的变量必须先声明后使用,定义变量需要显示的声明一个在编译时就能确定的类型。 Java中的数据类型有两种,基本类型(Primitive Type)和引用类型(Reference Type)。 1)基本数据类型 Java 基本类型分为两类:数值型和布尔型。数值型可分为整型以及浮点型,整形中的字符型也可单独分为一类。所以一般把基本类型分为4类,如下表: 分类 类型 长度 整数型 int 32位 long 64位 short 16位 byte 8位 字符型 char 16位 浮点型 double 64位 float 32位 布尔型 boolean 1位 ①整型:int为最常用的整型变量。系统中的整数常量会被看作int处理。但有以下两个例外: 如果一个整数很小(在byte或short)的范围内,当这个整数常量被付给一个byte或short变量时,整数常量会被当作byte或short类型。 如果一个巨大的整数常量(超出了Int的存储范围)时,系统不会把这个整数当作long类型处理,除非用户在常量后加上一个字母"L"。 示例: [java] view plain copy public class IntegerValTest { public static void main(String[] args) { //下面代码是正确的

构造函数

天大地大妈咪最大 提交于 2019-11-27 08:43:53
构造函数初始化式 构造函数分为初始化阶段、普通计算阶段,计算阶段由构造函数体中所有语句组成,初始化阶段发生在计算阶段之前 初始化阶段 // 构造函数初始化列表,m_nAge用参数nAge初始化,m_strName初始化为wangwu Teacher::Teacher(const int nAge):m_nAge(nAge),m_strName("wangwu") {} 如果没有给类成员提供初始化式,默认调用类成员默认构造函数,成员类没有默认构造会报错 初始化const数据成员和引用类型数据成员必须在初始化式中 总结 必须对没有构造函数或者const数据成员和引用类型数据成员使用初始化式 来源: https://www.cnblogs.com/xiongyungang/p/11355415.html

02JAVA学习

牧云@^-^@ 提交于 2019-11-27 08:26:51
---恢复内容开始--- 一、switch语句 switch语句格式: switch(表达式) { case 值1: 语句体1; break; case 值2: 语句体2; break; … default: 语句体n+1; break; } 二、循环结构 1.for循环语句 for循环语句格式: for(初始化语句;判断条件语句;控制条件语句) { 循环体语句; } 2.while循环语句: while循环语句格式: 基本格式 while(判断条件语句) { 循环体语句; } 3.for循环和while循环的区别 for循环语句和 while循环语句可以等价转换,但还是有些小区别的 使用区别:控制条件语句所控制的那个变量,在 for循环结束后,就不能再被访问到了,而 while循环结束还可以继续使用,如果你想继续使用,就用 while,否则推荐使用 for。原因是 for循环结束,该变量就从内存中消失,能够提高内存的使用效率。 场景区别: for循环适合针对一个范围判断进行操作 while循环适合判断次数不明确操作 4.do while循环语句 基本格式 do { 循环体语句; }while((判断条件语句); 三、跳转控制语句 1.break 中断 2.continue 继续 3.return 返回 四、方法(函数) 1.方法定义及格式: 简单的说:方法就是完成特定功能的代码块

Java编程思想目录

怎甘沉沦 提交于 2019-11-27 07:39:15
前言 第1章 对象导论 1.1 抽象过程 1.2 每个对象都有一个接口 1.3 每个对象都提供服务 1.4 被隐藏的具体实现 1.5 复用具体实现 1.6 继承 1.6.1 “是一个”(is-a)与“像是一个”(is-like-a)关系 1.7 伴随多态的可互换对象 1.8 单根继承结构 1.9 容器 1.9.1 参数化类型(范型) 1.10 对象的创建和生命期 1.11 异常处理:处理错误 1.12 并发编程 1.13 Java与Internet 1.13.1 Web是什么 1.13.2客户端编程 1.13.3 服务器端编程 1.14 总结 第2章 一切都是对象 2.1 用引用操纵对象 2.2 必须由你创建所有对象 2.2.1 存储到什么地方 2.2.2 特例:基本类型 2.2.3 Java中的数组 2.3 永远不需要销毁对象 2.3.1 作用域 2.3.2 对象的作用域 2.4 创建新的数据类型:类 2.4.1 域和方法 2.4.2 基本成员默认值 2.5 方法、参数和返回值 2.5.1 参数列表 2.6 构建一个Java程序 2.6.1 名字可见性 2.6.2 运用其他构件 2.6.3 static 关键字 2.7 你的第一个Java程序 编译和运行 2.8 注释和嵌入式文档 2.8.1 注释文档 2.8.2 语法 2.8.3 嵌入式HTML 2.8.4 一些标签示例 2.8

C++ 构造过程和析构过程

左心房为你撑大大i 提交于 2019-11-27 01:30:06
1、C++构造和析构的过程,类似于穿衣脱衣的过程。穿衣是:先穿内衣,再穿外套。脱衣是:先脱外套,再脱内衣。C++构造过程:首先调用父类构造方法,再调用子类构造方法。C++析构过程:首先调用子类析构方法,再调用父类析构方法。 2、子类不能继承父类的构造方法和析构方法,除此之外,其他的成员都能继承,包括父类的private成员,只不过子类不能访问private成员。 3、思考一下,为什么子类不能继承父类的构造方法?   想一想,构造方法是干什么的?构造方法是初始化对象的成分,创建对象。从语义上讲,父类构造方法初始化父类成分,构造父类对象。子类构造方法在父类对象的基础上,初始化子类专有成分,构造子类对象。如果子类继承父类构造方法,那么子类暴露一个接口,返回父类对象,这显然不合理。因此,子类不能继承父类的构造方法。 4、父类的成分只能在父类构造方法中初始化,子类只能初始化自己的专有成分,不能初始化父类的成分,可以在方法内赋值。子类如果初始化父类成分,编译报错:非法的成员初始化,不是基或成员。那么问题来了,子类没有继承父类的构造方法,那么子类如何初始化父类的成分呢? 5、子类不能继承父类的构造方法,但是可以调用父类的构造方法,而且必须调用父类的构造方法,确保父类成分初始化。如果没有显示调用父类的构造方法,会隐式调用父类的default构造方法。子类没有显式调用父类构造方法