初始化

赋值与初始化

≡放荡痞女 提交于 2020-03-03 13:29:44
int y = 8; x = 9;   初始化(给一个变量它的初值);   赋值(给一个变量一个新的值);     以上看上去如此相似,但是,赋值和初始化在逻辑上是不同的。    可以通过类型描述(如 int 或 string)来区分它们,初始化总是从类型描述开始,而赋值并不需要这样做。 从原则上来说,初始化时变量总是空的。另一方面,赋值在放入一个新的值之前,首先必须将旧的值清空。   当我们想将一个新的值放入一个对象,就需要赋值操作。   在考虑赋值操作时,很明显它在多次重复做一些事情时赋值是最有用的。如果想以一个不同的值重复做某事 时,我们需要进行一次赋值。 实列:检查重复单词 #include <iostream> using namespace std; int main() { string previous = " "; //previous word;initialized to "not a word" string current; //current word while(cin >> current) //read a stream of words { if(previous == current) //check if the words is the same as last cout << "repeated word: "<< current <<

C++初始化和赋值的区别

心不动则不痛 提交于 2020-03-03 13:29:24
普通情况下,初始化和赋值好像没有什么特别去区分它的意义。 int a=100;和int a;a=100间仿佛没有任何区别,但是当c++中引入类后,情况变得有些复杂。 首先理清下 构造函数 的一些东西。 关于构造函数,前面有两篇随笔写了默认构造函数和拷贝构造函数,其实还包括参数为一些成员变量属性的构造函数,现在自己理一下,这两个东西,他们只是参数不同,也就是说只是使用他们的方式不同。默认构造函数是不传参,构建的对象默认的使用那些值赋值给成员变量;而拷贝构造函数是接受一个相同类的另一个对象,使用该对象来逐成员的为自己的成员赋值;其他的一些构造函数也是如此,他们只是走的路线不同, 最终目的都是为构建的一个对象进行初始化。 也就是说,构造函数的目的,是服务于类的初始化的,它并不服务于赋值。赋值是独立于初始化之后的操作。 这么讲比较抽象,举一个栗子: 例子转自: https://blog.csdn.net/qq_38211852/article/details/80629691 #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;

spring bean 是什么?它的作用域是哪些?它的生命周期是什么?

邮差的信 提交于 2020-03-03 12:02:14
Spring Bean是事物处理组件类和实体类(POJO)对象的总称,Spring Bean被Spring IOC容器初始化,装配和管理。 或者简单的理解就是对象。 作用域: singlton:单例模式,对象在容器中全局唯一,在IOC容器初始化的时候该对象就会被创建 prototype:多例模式,在每一次调用getBean的时候IOC容器才会创建该对象的实体,并且每次创建都是不同的对象 request:在HTTP请求bean范围内会会对每一个来自客户端的网络请求创建一个实例,在请求完成后,bean会失效并被垃圾回收器回收 session:HTTP session请求范围,确保每个session中有一个bean的实例,同一个session共享同一个bean,不同session,bean也不同。在session过期后、bean会自动失效。仅用于 WebApplicationContext 环境 global-session:除在portlet不一样外,其余情况下与session作用域一样。在portlet中,全局共享一个bean。 生命周期: 实例化-属性赋值-初始化-销毁 大致分为4个,只不过其中穿插了其它,导致不清楚。详细请看 请别再问Spring Bean的生命周期了! 来源: https://www.cnblogs.com/ivy-xu/p/12401162.html

从源码分析Spring是如何解决循环依赖的

試著忘記壹切 提交于 2020-03-03 08:06:05
循环依赖问题 什么是循环依赖 首先看一下下面的Spring配置文件 <!-- beanA依赖于beanB --> <bean id="beanA" class="top.okay3r.ClassA"> <property name="beanB" ref="beanB"/> </bean> <!-- beanB依赖于beanA --> <bean id="beanB" class="top.okay3r.ClassB"> <property name="beanA" ref="beanA"/> </bean> 当IOC容器读取上面的配置时,就会先对beanA进行加载;在对beanA进行属性填充时,会发现beanA依赖于beanB,然后就会对beanB进行加载;当对beanB进行属性填充时,又会发现beanB依赖于beanA,于是就加载beanA… 可以想到,如果Spring的容器对于这种循环依赖问题不作出响应的处理,那么就会无限执行上面的过程。最终的结果就可能造成OOM从而导致程序崩溃 Spring中bean注入的方式 我们知道在Spring中,注入bean的方式有【构造器注入】和【setter注入】两种方式。但在我们使用Spring管理bean时,可能会遇到一种特殊的情况,那么就是上面所说的循环依赖问题 我们再看一下Spring创建bean的过程 Spring创建bean的过程

JVM类加载

心已入冬 提交于 2020-03-03 07:55:19
类加载机制 类从被加载到虚拟机内存开始,到卸载出内初为止,它的整个生命周期:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析3个部分统称为链接(Linking) 初始化 :5种情况 1,遇到new、getstatic、putstatic和invokestatic这4个字节码指令时,如果类没有进行过初始化,则需要先触发其初始化 2,使用java.lang.reflect包的方法对类进行反射调用 3,当初始化一个类,如果发现其父类没有进行过初始化,则需要先触发其父类的初始化。 4,当虚拟机启动时,需要启动一个主类,虚拟机先初始化其主类 5,当使用JDK1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后解析结果Ref_getStatic、REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,这个方法对应类没有初始化,则需先进行初始化。 加载阶段: 1,通过一个类的全限定名来获取定义此类的二进制自己流 2,将静态存储结构转换为方法区运行时数据结构 3,再内存中生成一个java.lang.Class对象

Git 命令

夙愿已清 提交于 2020-03-03 07:07:08
git reset --hard 初始化 -- 强制回退 初始化 git init -- 初始化一个git仓库 git add . -- 将当前仓库所有代码都加载到git暂管区 git commit -m '备注' -- 提交代码到本地git ----------到github上创建仓库(https)---------- git remote add origin https://github.com/... -- -- 将代码添加到源 git pull --rebase origin master -- 将远程库与本地同步合并 git push -u origin master -- 将代码推送到源 来源: CSDN 作者: 萌神30号 链接: https://blog.csdn.net/java__project/article/details/104608491

C++ Primer 学习笔记 第七章 类

依然范特西╮ 提交于 2020-03-03 05:59:05
类的基本思想是数据抽象和封装。数据抽象是一种依赖于接口和实现分离的编程技术,类的接口包括用户所能执行的操作,类的实现则包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。封装实现了类的接口和实现的分离,封装后的类隐藏了它的实现细节,即类的用户只能使用接口而不能访问实现部分。 类要想实现数据抽象和封装,首先需要定义一个抽象数据类型,在抽象数据类型中,由类的设计者负责考虑类的实现过程,而使用该类的程序员只需要抽象地思考类型做了什么,而无须了解类型的工作细节。 我们可以通过抽象数据类型提供的接口来完成某些操作,但如果一个类没有任何接口供用户使用,只有一些数据成员,那这个类就不是抽象数据类型,一旦定义了一些成员函数供类的用户使用,它就变成了了抽象数据类型。 定义和声明成员函数的方式与普通函数差不多,成员函数的声明必须在类的内部,但它的定义既可以在类的内部,也可以在类的外部。定义在类内部的函数是隐式的inline函数。 Sales_data类: struct Sales_data { string isbn ( ) const { return bookNo ; } Sales_data & combine ( const Sales_data & ) ; double avg_price ( ) const ; string bookNo ; unsigned units

分配内存

本秂侑毒 提交于 2020-03-03 03:30:25
分配内存的方法 面试中比较见问的一个问题。 注意: 只有calloc函数会将分配内存初始化为0 new是C++独有的,其是运算符,而不是函数。 下面对其分别进行介绍: malloc 函数: void *malloc(unsigned int size) 1 在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化。 2)calloc 函数: void *calloc(unsigned int num, unsigned int size) 1 按照所给的数据个数和数据类型所占字节数,分配一个 num * size 连续的空间。calloc申请内存空间后,会自动初始化内存空间为 0,但是malloc不会进行初始化,其内存空间存储的是一些随机数据。 3)realloc 函数: void *realloc(void *ptr, unsigned int size) 1 增加或减少以前分配区的长度。当增加长度时,可能需要将以前分配区的内容移到另一个足够大的区域,以便在尾端提供增加的存储区,而新增的区域内的初始值不确定。 4)new是动态分配内存的运算符: 自动计算需要分配的空间,在分配类类型的内存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工作

java程序运行过程和内存分析

ぃ、小莉子 提交于 2020-03-03 02:51:59
java程序运行过程和内存分析 java程序运行过程和内存分析 Java程序运行分析概括 内存分析 - 方法区 - 虚拟栈 - 程序计数器 - 堆 - 本地方法区 案例分析 java程序运行过程和内存分析 此篇文章是个人看了一些资料得出的总结,如有不准确,烦请指正。仅供参考。 Java程序运行分析概括 当运行一个Java 程序时。需要经过编译和运行两个阶段。而这里涉及到的内存,是指在运行时,程序的内存划分。编译阶段由编译器将Java文件编译成字节码文件。而运行一个程序时,首先会启动一个java虚拟机进程。java虚拟机包括类装载器和执行引擎。然后进行 加载 - 连接 - 初始化这三个过程。这里区分一下初始化和实例化这两个概念。初始化是针对类的,而实例化是针对对象的。下面粗略概览一下运行过程。 编译阶段 将java文件由编译器编译为字节码文件 运行阶段 1、加载 通过类的名称获取字节码文件的二进制字节流,并转换为静态存储结构存放于 方法区 ,并生成唯一的class对象。作为访问方法区中该数据类型的访问接口。 2、连接 -验证:确保被加载类的正确性(即使编译正确,但字节码文件也有可能被修改) -准备:为类的静态变量分配内存,并将其初始化为默认值。 -解析:把类的符号引用转换为直接引用。 3、初始化 为类的的初始化赋予正确的初始值和分配内存空间,初始化一般通过显示的直接赋值

C风格字符串

大城市里の小女人 提交于 2020-03-02 21:08:55
尽管C++支持C风格字符串,但在C++程序中最好还是不要使用它们。这是因为C风格字符串不仅使用起来不太方便,而且极易引发程序漏洞,是诸多安全问题的根本原因。 字符串字面值是一种通用结构的实例,这种结构即是C++由C继承而来的C风格字符串。C风格字符串不是一种类型,而是为了表达和使用字符串而形成的一种约定俗成的写法。按此习惯书写的字符串存放在字符数组中并以空字符串结束。以空字符结束的意思是在字符串最后一个字符后面跟着一个空字符('\0')。一般利用指针来操作这些字符串。 C标准库String函数 下表列出了C语言标准库提供的一组函数,这些函数可用于操作C风格字符串,它们定义在出string头文件中,出string是C语言头文件string.h的C++版本。 C风格字符串的函数 strlen(p)      返回p的长度,空字符不计算在内 strcmp(p1,p2) 比较p1和p2的相等性。如果p1==p2,返回0;如果p1>p2,返回一个正值;如果p1<p2,则返回一个负值 strcat(p1,p2)    将p2附加到p1之后,返回p1 strcpy(p1,p2)    将p2拷贝给p1,返回p1 传入此类函数的指针必须指向 以空字符作为结束的数组 : char ca[]={'c','+','+'}; //不以空字符结束 cout<<strlen(ca)<<endl; //严重错误