初始化列表

函数指针 —— 《C和指针》

断了今生、忘了曾经 提交于 2020-01-17 03:59:39
函数指针 函数指针是指向函数的指针。 因此“函数指针”本身首先是指针变量,只不过该指针变量指向函数。 声明 返回值类型 ( *指针变量名) (形参列表); int (*pfunc)(int x); int (*pfunc)(int); //无需将形参名给出 初始化 和普通指针一样,函数指针在使用之前必须初始化为指向某个函数。 int func(int x); //被指向的函数 pfunc = func; //初始化函数指针pfunc,使其指向函数func pfunc = &func; //也是正确的 int (*pfunc)(int) = func; //也可以直接在声明时进行初始化 注意:在函数指针初始化之前需要有被指向函数func的原型,否则编译器就无法检查func的类型是否和pfunc所指向的类型一致。 使用: int ans; ans = func(5); ans = pfunc(5); ans = (*pfunc)(5); //也是正确的,但间接访问操作是不必要的 注意:在初始化赋值语句中的操作符 & 和调用函数指针时的 * 操作符都是可选的: 1. 函数名被使用时总是由编译器把它转换为函数指针。 & 只是显示地说明了编译器将隐式执行的任务。 2. * pfunc把函数指针pfunc转换为一个函数名,编译器在执行函数调用之前又会把它转换回去。因此这个转换是不必要的。

java:final详解

£可爱£侵袭症+ 提交于 2020-01-17 02:31:22
final基础使用 修饰类 当某个类的整体定义为final时,就表明了你不能打算继承该类,而且也不允许别人这么做。即这个类是不能有子类的。 注意:final类中的所有方法都隐式为final,因为无法覆盖他们,所以在final类中给任何方法添加final关键字是没有任何意义的。 这里顺道说说final类型的类如何拓展? 比如String是final类型,我们想写个MyString复用所有String中方法,同时增加一个新的toMyString()的方法,应该如何做? 设计模式中最重要的两种关系,一种是继承/实现;另外一种是组合关系。所以当遇到不能用继承的(final修饰的类),应该考虑用组合, 如下代码大概写个组合实现的意思: class MyString { private String innerString ; // ...init & other methods // 支持老的方法 public int length ( ) { return innerString . length ( ) ; // 通过innerString调用老的方法 } // 添加新方法 public String toMyString ( ) { //... } } 修饰方法 常规的使用就不说了,这里说下: private 方法是隐式的final final方法是可以被重载的 private

【转】c++数组初始化

雨燕双飞 提交于 2020-01-15 08:57:58
 数组初始化列表中的元素个数小于指定的数组长度时,不足的元素补以默认值。 原文: C/C++数组初始化的一些误区 以前我这样初始化一个数组,并自我感觉良好: int a[5] = { 0 }; // 全部初始化为0 这种简单的写法让我非常爽,于是我又想把数组全部初始化为1: int a[5] = { 1 }; // 我想全部初始化为1 直到十分钟前,我都以为这句代码确实能够将5个元素全部初始化为1,但事实跟我想的完全不同!(基础的东西革命的本钱,疏漏不得啊) 全部初始化为0的那行代码确实是没问题的,可以正常工作。问题就出在想把数组全部初始化成一个非0的数,即非默认值,是行不通的(查看内存发现,只有数组的第一个元素被初始化为1,其他全为0)。这倒不是因为编译器对初始化为0给了个后门,而是因为一条基本语法规则: 数组初始化列表中的元素个数小于指定的数组长度时,不足的元素补以默认值。 对于基本类型int来说,当然就是补int()即0了。再看一下非基本类型的数组: string a[5] = { "foo" }; 有了上面的规则,就很容易知道其实相当于: string a[5] = { "foo", "", "", "", "" }; 即后面4个元素调用了string的默认构造函数进行的初始化,而第一个则调用的string::string(const char*)进行的初始化。

final关键字介绍

这一生的挚爱 提交于 2020-01-15 05:51:01
  许多程序设计语言都有自己的办法告诉编译器某个数据是“常数”。常数主要应用于下述两个方面:   (1) 编译期常数,它永远不会改变   (2) 在运行期初始化的一个值,我们不希望它发生变化   对于编译期的常数,编译器(程序)可将常数值“封装”到需要的计算过程里。也就是说,计算可在编译期间提前执行,从而节省运行时的一些开销。在Java中,这些形式的常数必须属于基本数据类型(Primitives),而且要用final关键字进行表达。在对这样的一个常数进行定义的时候,必须给出一个值。 无论static还是final字段,都只能存储一个数据,而且不得改变。   若随同对象句柄使用final,而不是基本数据类型,它的含义就稍微让人有点儿迷糊了。对于基本数据类型,final会将值变成一个常数;但对于对象句柄,final会将句柄变成一个常数。进行声明时,必须将句柄初始化到一个具体的对象。而且永远不能将句柄变成指向另一个对象。然而,对象本身是可以修改的。Java对此未提供任何手段,可将一个对象直接变成一个常数(但是,我们可自己编写一个类,使其中的对象具有“常数”效果)。这一限制也适用于数组,它也属于对象。 下面是演示final字段用法的一个例子: // The effect of final on fields class Value { int i = 1; } public class

Go语言学习笔记 - 第二章 程序结构(The Go Programming Language)

这一生的挚爱 提交于 2020-01-13 05:17:39
第二章 程序结构 2.1命名 划重点 函数名、变量名、常量名、类型名、语句标号和包名 以一个字母(Unicode字母)或下划线开头,跟任意数量的字母、数字或下划线,大写字母和小写字母是不同的。 关键字(25个) break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import return var 预定义的名字 (30+个),这些不是关键字,可以再定义中重新使用它们 内建常量: true false iota nil 内建类型: int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr float32 float64 complex128 complex64 bool byte rune string error 内建函数: make len cap new append copy close delete complex real imag panic recover 作用域:内部定义内部有效;外部定义包内有效,名字开头 大写 可在包外部可见。比如: fmt 的 Print 可以在 fmt

C++ Primer:第2章总结

随声附和 提交于 2020-01-10 11:39:17
第2章 变量和基本类型 2.1 基本内置类型 基本内容: 算术类型包含字符,整型数,布尔值和浮点数,空类型不对应具体值,仅用于无返回值时函数的返回类型等特殊场合。 类型转换:将对象从一种给定的类型转换为另一种类型。 字面值常量:整型字面值,浮点型字面值,字符字面值,字符串字面值,转义序列,字面值前缀和后缀,布尔字面值,指针字面值。 备注: 整型包括布尔类型和字符类型。 bit是数据存储的最小单位,byte是数据处理的基本单位,字是整数运算的自然单位:1 word = 4 byte(32位机器), 1byte = 8 bit。 类型选择:若数值不为负选用无符号类型;整型运算选用int;算术表达式不用char或bool;浮点数运算选用double。 切勿混用带符号类型和无符号类型。 2.2 变量 基本内容: 变量定义:类型说明符+变量名列表。初始化,列表初始化,默认初始化。 变量声明与变量定义:声明和定义都规定变量的类型和名字,此外定义申请存储空间,可能初始化;变量只能定义一次,声明多次。 标识符:由字母、数字和下划线组成,必须以字母或下划线开头,区分大小写。 名字作用域:全局作用域,块作用域,内层作用域,外层作用域 备注: 初始化 != 赋值。 用{}进行列表初始化,函数体内部的内置类型变量不会被默认初始化。 变量名用小写,类名以大写开头,多个单词用下划线连接。 变量第一次使用时

欢乐C++ —— 5. 类的初始化

坚强是说给别人听的谎言 提交于 2020-01-10 11:16:08
本文测试内容大部分都是参考该博文 https://www.cnblogs.com/cposture/p/4925736.html 该博文作者深入汇编,写的十分详细,感谢作者大大。 之所以挪一次,是想精简一下,并且补充一些东西。 简述 先简单看看直接初始化和拷贝初始化的定义,然后再详细试验一下不同的拷贝初始化场景会调用哪种拷贝函数。实验环境 vs2017 已关闭编译器优化。 直接初始化和拷贝初始化 类的初始化分为直接初始化和拷贝初始化。 直接初始化就是在定义对象时不使用 = 号的初始化方式。调用普通构造函数。 string s1("123"); string s2(s1); 在c++11中,容器调用 emplace 成员函数创建的元素也进行直接初始化。 而拷贝初始化分很多情况,将会在以下情况发生。 在用 = 定义变量时。 函数调用时将 实参对象 传给 非引用的形参对象。 函数返回时返回非引用类型的对象。 用花括号列表初始化一个数组中的元素或聚合类中的成员。 某些类的某些函数也会拷贝初始化,例如容器的 insert 和 push 成员。 需要注意的是 拷贝初始化将跟据不同的情况调用不同的拷贝构造函数。 直接初始化有时会调用拷贝构造函数。例如 String s3(s1); 拷贝初始化过程中类类型的隐式转化不可忽略。许多时候,比较奇怪的语法往往是类类型隐式转化造成。 开始实验

面试(二)

陌路散爱 提交于 2020-01-09 18:51:32
4.介绍一下java的数据结构,然后手写一个栈的类 主要可以分为两类: 1)Java中定义了一个接口collection,用来存储一个元素集合 2)另一种是定义了映射(map)用来存储键/值对。 Collection接口为线性表(list)、向量(vector)、栈(stack)、队列(queue)、优先队列(priority queue)以及规则集(set)定义了通用的操作 Set(规则集) 用于存储一组不重复的元素。 重要的实现类: HashSet 。 List(线性表) 用于存储一个有序元素的集合(允许重复)。两个重要的实现类: ArrayList (数组线性表类)和 LinkedList (链表类)。 Stack(栈) 用于存储采用后进先出方式处理的对象。 Queue(队列) 用于采用先进先出方式处理的对象。不过队列用双向链表 LinkedList 实现更好 PriorityQueue用于存储按照优先级顺序处理的对象。 map(映射)是一个存储“键/值对”集合的容器对象。键很像索引,在List中,索引是整数;在Map中,键可以是任意类型的对象。映射中不能有重复的键,每个键都对于一个值。 线性表、栈、队列、优先队列: ArrayList、LinkedList 都是线程不安全的 。 vector是线程安全的。 ArrayList :用数组存储元素。这个数组是动态创建的

[C++]C++面试知识总结

只谈情不闲聊 提交于 2020-01-08 23:40:04
1.程序运行知识 1.1 内存布局和分配方式 C程序的内存布局如下: 静态存储区:存储全局变量和static变量,通常在程序编译期间已经分配好了。 BSS段:存放未初始化的static变量和全局变量 Data段:存放初始化过的static变量和全局变量 Text段:存储程序的二进制代码,程序代码区。   堆:程序运行时通过malloc申请的内存区存放在堆中,需要使用free来释放该内存空间,生存期在malloc和free之间。 栈:执行函数时,函数的局部变量存储在栈中,执行结束后自动释放该内存区域,栈内存分配运算内置与处理器指令集中。 C++程序的内存布局与C程序布局类似,区别是C++不再区分全局变量和静态变量是否已经初始化,全部存储在静态存储区;另外堆中存放new/delete申请释放的资源,而malloc和free申请的资源存放在自由存储区。 1.2 内存溢出原因 栈溢出:越界访问造成,例如局部变量数组越界访问或者函数内局部变量使用过多,超出了操作系统为该进程分配的栈的大小,还有递归函数层次过多超过了栈大小。 堆溢出:程序申请了资源但忘记释放该资源,造成内存泄露,累积泄露内存过多会造成内存溢出。 1.3 内存泄露和检测 C++内存泄漏检测内存泄露是指程序中动态分配了内存,但是在程序结束时没有释放这部分内存,从而造成那一部分内存不可用的情况。 动态内存泄露检测:检查new

第5章-初始化与清理

让人想犯罪 __ 提交于 2020-01-08 00:42:22
Think in java 读书笔记 pikzas 2019.03.06 第五章 初始化与清理 Think in Java 中该章节的内容只是初步介绍了一些语法层面的内容,具体的细节需要参考之后的另一本书周志明的《深入理解Java虚拟机》 知识点 方法重载 方法名相同 但是参数列表不同 参数的个数 参数的类型 参数的顺序 基本数据类型参数的重载 基本参数类型可以从一个较小的类型转为一个较大的类型,但是有些要注意 可以看到char是特例 char类型会直接提升到int类型。 反之 如果实参是较大的数据类型,而形参是较小的数据类型。则在调用的时候需要显示强转。表明你已经认识到可能会有丢失数据精度的可能。 一个认知错误的地方就是,不可能依据返回值的不同来重载方法。因为返回值不是方法签名中的一员。 一旦手动改写了构造函数,则编译器就不会为我们隠式添加默认的构造函数。 this关键字指的是调用当前类中某个方法的对象是谁,所以this关键字只可能存在于方法之内。 this的一个应用就是用来返回自身对象 class Demo{ int i = 0; Demo increment(){ i++; return this; } void print(){ System.out.println("i = "+i); } public static void main(String[] args){