C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。...也就是说,想要告诉编译器是缺省函数只需要告诉一次就可以了(声明或定义,而不是声明和定义)。 一般来说,缺省参数出现在函数声明中即可(也就是头文件中)。...函数重载是什么 函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型...这里就是C语言不支持重载的原因: 在同一个源文件中定义的相同的函数名后,到形成符号表这里会出现两个相同的函数名,并且这两个函数还都是有效的,是编译错误。...如果不在同一个源文件中编译链接,分别形成的符号表里各自出现函数名,并且分配一个有效的地址。
链接器处理归档文件的方法是:扫描归档文件,寻找某些成员,这些成员的符号目前已被引用,不过还没有被定义。但是,如果链接器找到普通的 OBJ 文件,而不是库文件,就把这个 OBJ 文件按平常方式链接进来。...2.8 目录选项(Directory Option) 下列选项指定搜索路径,用于查找头文件,库文件,或编译器的某些成员。 (1)-Idir 在头文件的搜索路径列表中添加 dir 目录。...-o test main.o -lsub (4)-Bprefix 这个选项指出在何处寻找可执行文件,库文件,以及编译器自己的数据文件。...如果仍然没能够找到所需文件,编译器就在‘PATH’环境变量指定的路径中寻找没加任何前缀的文件名。如果有需要,运行时(run-time)支持文件’libgcc.a’也在‘-B’前缀的搜索范围之内。...如果这里没有找到,就在上面提到的两个标准前缀中寻找,仅此而已。如果上述方法没有找到这个文件,就不链接它了。多数情况的多数机器上,’libgcc.a’并非必不可少。
如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。...执行可执行程序 在执行可执行程序时,出现以下错误,说找不到库文件,在继续往下看之前大家想想这是为什么?...因为在动态函数库使用时,会查找/usr/lib、/lib目录下的动态函数库,而此时我们生成的库不在里边。我们可以通过以下方法解决此问题,其实这个问题在上一节中我们提到过,小伙伴可以回看一下。...1.最直接最简单的方法就是把libTest.so拷贝到/usr/lib或/lib中去。...,所以想要顺利运行,我们也可以把我们库的目录加入到这个文件中并执行/sbin/ldconfig 动态加载库 上面共享库的调用属于动态链接方法,此外我们还可以动态加载,在上一节中我们讲过二者的区别,此处不做过多讲解
通过引用命名空间,我们可以告诉编译器我们希望使用哪个命名空间中的名称,从而避免因为名称冲突而导致的编译错误。...例如,当我们在代码中写using namespace std;时,我们就告诉编译器我们想使用标准库中的所有名称,而不需要在每次调用标准库函数或类时都加上std::前缀。...而引用头文件(#include)则是C++中实现代码重用和模块化编程的重要手段。头文件通常包含了类的声明、函数的原型、常量定义等,它们可以被多个源文件共享和引用。...通过引用头文件,我们可以实现代码的模块化,使得每个模块只关心自己的功能实现,而不必关心其他模块的实现细节。...综上所述,引用命名空间和引用头文件在C++编程中各有其独特的作用。引用命名空间主要用于解决命名冲突和简化代码书写,而引用头文件则主要用于实现代码重用和模块化编程。
这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进可执行文件了...B.这类库的名字一般是libxxx.so,动态库又称共享库;相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用函数库里的相应函数,因此动态函数库所产生的可执行文件比较小...而且如果多个应用程序都要使用同一函数库,动态库就非常适合,可以减少应用程序的体积。 注意:不管是静态函数库还是动态函数库,都是由*.o目标文件生成。...函数库的创建 静态函数库的创建 ar rcs libname.a a.o b.o ar:静态函数库创建的命令 -c :create的意思 -r :replace的意思,表示当前插入的模块名已经在库中存在...如果若干模块中有一个模块在库中不存在,ar显示一个错误信息,并不替换其他同名的模块。默认的情况下,新的成员增加在库的结尾处。 s:写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。
如果若干模块中有一个模块在库中不存在,ar显示一个错误信息,并不替换其他同名的模块。默认的情况下,新的成员增加在库德结尾处。...快看看错误提示,原来是找不到动态库文件libmyhello.so。程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。...为此解决方法:1. 我们将文件libmyhello.so复制到目录/usr/lib中:mv libmyhello.so/usr/lib/2....:gcc -fPIC -shared b1.c -o libb.so编译错误!...使用G++对其进行编译:g++ -fPIC -shared b1.c -o libb.so编译成功!可见GCC和G++对于这种全局变量初始化的方法,支持力度是不一样的。
我们并没有在代码中对我们的Java程序打包(package xxx;),我们知道Java中对程序进行package有很重要的意义:能够模块化程序,通过定义不同的包来实现模块化的开发,同时也能够帮助其他接手或者学习代码的人能够有很好的引导作用...前者会提示:“错误: 找不到或无法加载主类 Main”, 原因就是我们定义是一个src.main.Main的类,很显然这里没有类名为Main的类;后者会提示:“错误: 找不到或无法加载主类 src.main.Main...└── target 首先在Sub.java中我们编写如下的代码: package myutil; public class Sub { // 静态工具方法 public static...args) { // 调用Sub类中的静态方法 Sub.printWithFormat("Hello"); } } 这里我们定义了dir1、2两个文件加,虽然和...Main类与Sub类中package的包名不同,但是,当我们在编译时,只要指定了正确目录下的对应的java类即可,就像我们可以进入dir1类中使用如下命令: $ pwd xxx/java-demo/dir1
include 该hpp文件即可,无需将cpp加入到项目中进行编译,而实现代码将直接编译到调用者的obj文件中,不再单独生成obj,采用hpp将大幅度的减少调用项目中cpp文件数和编译次数,也不用发布lib...不可使用静态成员:静态成员的使用限制在于如果类含有静态成员,则在hpp中必需加入静态成员初始化代码,当该hpp被多个文档include时,将产生符号重定义错误。...当然,缺点就是如果不同头文件的宏名不小心"撞车",可能就会导致头文件明明存在,编译器却硬说找不到声明的状况 #pragma once则由编译器提供保证:同一个文件不会被包含多次。...对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的"找不到声明"的问题,重复包含更容易被发现并修正。...方式一由语言支持所以移植性好,方式二 可以避免名字冲突 C++模块类 模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数申明一种一般的模式,使得类中的某些数据成员或者成员函数的参数,返回值取得任意类型
子类继承了父类的属性(数据成员)和方法(成员函数)。这意味着子类无需重新定义父类中已有的属性和方法,就可以直接使用它们。解决问题:共性的抽取,实现代码复用。...2.子类与父类的成员同名的时候:如果访问的变量在子类中存在,就访问子类的成员变量,如果没有,就在父类里面找,如果还是没有编译器就报错。...这是子类的成员方法 5.super关键字 在上述中代码中,当子类与父类的成员变量,或者成员方法名一样时,如何使用父类的呢?...9.protect关键字 protect关键字可用于,同一包中的同一类和不同类,以及不同包中的子类。...如图所示,protect只能用于同一包中,和不同包中的子类,由于小编在这里无法展示,不同包的情况,请见谅。
** 之所以要调用父类的构造方法,是因为super类可能需要构造函数来初始化一些私有的成员变量。...编译器自动插入super构造方法后,子类的构造函数就会像下面这样: public Sub(){ super(); System.out.println("Sub"); } 2 常见错误:...Must define an explicit constructor 这个错误是很多开发者经常遇到的错误,错误原因就是找不到超类中的默认构造函数。...编译器错误是因为默认的super()无参的构造函数是没有定义的。在Java中,如果一个类没有定义构造函数,编译器会自动插入一个默认的无参的构造函数。...比如说,考虑这个Scanner类,他有几个构造函数,你可以通过这几个构造函数,声明你想要读取数据的来源,如果编译器增加了无参的构造函数,那么你不给定读取的数据源,就会报错,程序无法执行,因为我们不能不指定一个数据源就让他去读取数据
在面向对象编程方法中,程序由通过动作相互交互的各种对象组成。 对象可能采取的动作称为方法。 相同类型的对象被认为具有相同的类型,或者更经常地被称为在同一类中。...Methods 方法 -方法基本上是一种行为。 一个类可以包含许多方法。 它是在写逻辑,操纵数据和执行所有动作的方法中。A method is basically a behavior....对象是类的一个实例: Dim r As New Rectangle() 类可以具有可以从外部类访问的成员,如果指定的话。 数据成员称为字段,过程成员称为方法。...Enum语句声明一个枚举并定义其成员的值。 Enum语句可以在模块,类,结构,过程或块级别使用。...3 Async 表示它修改的方法或lambda表达式是异步的。 这样的方法被称为异步方法。 异步方法的调用者可以恢复其工作,而不必等待异步方法完成。
联合体的定义与特点(共享内存) 联合体和结构体有点类似,但它最大的特点是其所有成员共享同一块内存空间。...,再去访问ch成员,其实就是从同一块内存按照不同的类型解读数据,这在一些内存空间有限且需要根据不同情况复用的场景很有用。...尖括号形式用于包含标准库头文件,编译器会在系统指定的标准库路径中查找文件;双引号形式用于包含自定义头文件,编译器会先在当前源文件所在目录查找,如果找不到再去标准库路径查找。...在学生成绩管理系统中,数据输入输出模块获取用户输入的数据后,将其传递给数据存储模块进行存储。...编译器在编译时会报告语法错误的位置和错误信息。排查方法是仔细查看编译器提示的错误信息,根据错误位置检查代码是否符合语法规范。
封装就是把属于同一类事物的共性(包括属性与方法)归到一个类中,以方便使用。...②对象的数据封装特性还可以把对象的私有数据和公共数据分离开,保护了私有数据,减少了可能的模块间干扰,达到降低程序复杂性、提高可控性的目的。...当子父类中成员变量同名时用super区分父类。 ...⑶ 子类方法的访问权限应比父类方法更大或相等 尤其需要指出的是:覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法,例如下面的代码将会有编译错误:...多态的定义: 指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。
()调用不同文件中的方法了。.../test" 导入同一目录下test包中的内容(相对路径) import "shorturl/model 加载gopath/src/shorturl/model模块(绝对路径) import...注意:这种形式的import,当import时就执行了fmt包中的init函数,而不能够使用该包的其他函数。 未使用的导入包,会被编译器视为错误 (不包括 "import _")。 ....Golang初始化 初始化函数: • 每个源文件都可以定义一个或多个初始化函数。 • 编译器不保证多个初始化函数执行次序。...如果文件中仅有一个 Example 函数,且调用了该文件中的其他成员,那么示例会显示整个文件内容,而不仅仅是测试函数自己。
子类中的成员变量或方法与父类中的成员变量或方法同名时,用 super 进行区分 class Person{ protected String name; public Person(String...(一般指的就是方法,语句体内) 存储位置 成员变量:随着对象的创建而存在,随着对象的消失而消失,存储在堆内存中。 局部变量:在方法被调用,或者语句被执行的时候存在,存储在栈内存中。...当方法调用完,或者语句结束后,就自动释放。 生命周期 成员变量:随着对象的创建而存在,随着对象的消失而消失 局部变量:当方法调用完,或者语句结束后,就自动释放。 初始值 成员变量:有默认初始值。...引起该异常的原因是 JVM 或 ClassLoader 尝试加载某类时在内存中找不到该类的定义,该动作发生在运行期间,即编译时该类存在,但是在运行时却找不到了,可能是变异后被删除了等原因导致; ClassNotFoundException...显然,在 finally 中返回或者修改返回值会对程序造成很大的困扰,C#中直接用编译错误的方式来阻止程序员干这种龌龊的事情,Java 中也可以通过提升编译器的语法检查级别来产生警告或错误。
因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计 ---- 命名空间 在C/C++中,变量、...我们来看一个例子: 此时的变量与库里面的冲突了,这时候我们就可以利用命名空间来解决这个问题 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后跟着一对{}即可,{}中即为命名空间的成员...: ---- 实际上,为了避免命名冲突,C++把官方库内容定义到了命名空间——std (同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中) C++输入与输出 我们前面说到,...函数重载 函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题...对于C语言不支持函数重载我们是可以很好理解的(在编译链接过程中,通过符号表找到函数名和函数地址),同名函数C语言是区分不了的。 而在C++中,可以去进行区分。
,其中集成了大量js或ts开发中需要的包和代码模块,当你在项目中需要引用这些包或模块时,随时可以利用npm指令进行快速下载使用,这样不被引用的模块不必占用过多项目空间。...run build 来代替执行自定义添加的命令行内容;在第一次build时,系统一般会告诉你它蠢蠢的没有找到pkg,这时,你只需要执行安装它的指令即可: > npm i -g pkg 同样的,之后在编译过程中遇到了引用的模块或库找不到的情况...如果是在C#中书写json的数据结构,将是一件非常麻烦的事,需要严格的定义为一个新的类或结构体,但ts中似乎相当自由,只需要用一个变量来代替即可,甚至直接在赋值初始化的时候来确定键值。...x2[x1]中x1对应的字符串x2这一键并没有被修改或删除,而x2.x1中键x1是一个固定的变量名,所以它的值理所当然的被改变为了后面的字符串6,又因为x1的值已经发生了改变,所以x2[x1]已经不再是原来的任何一个键...经过上面的对比测试,应该已经可以很好的区分什么时候用".成员名",什么时候用[变量]了,返回前面的json的数据结构;因为文件名这一键是根据文件的不同随时都会变化的值,所以采用中括号的形式,而typ,url
(成员变量)的访问权限(范围): 公开级别: 用public 修饰,对外公开 受保护级别: 用protected 修饰, 对子类和同一个包中的类公开 默认级别: 没有修饰符号,向同一个包的类公开....(运行时看运行类型,例如找方法时就是采用就近原则) 因为在编译阶段,能调用哪些成员,是由编译类型决定的。...//(#)因为在编译阶段,能调用哪些成员,是由编译类型来决定的 //animal.catchMouse();错误 //(4)最终运行效果看子类(运行类型...看编译类型 10 Sub sub = new Sub(); System.out.println(sub.count);//?...1.当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定 2.当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用,找不到再去父类中寻找。
对于所有在同一虚拟机中运行的代码,只要他们包含相同的字符串字面常亮,该对象会被重用。...类和接口 13.使类和成员的可访问性最小化 要区别设计良好的模块和设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节。...泛型 在没有泛型之前,从集合读取到的每一个对象都必须进行转换,如果有人不小心插入了类型错误的对象,在运行的转换处理就会出错。有了泛型之后,可以告诉编译器每个集合中接受哪些对象类型。...编译器自动为你的插入进行转化,并在编译时告知是否插入了类型错误的对象,这样更安全,也更清楚。...50.如果其他类型更适合,则尽量避免使用字符串 51.当心字符串连接的性能(StringBuilder) 52.通过接口引用对象 53.接口优先于反射机智 丧失了编译时类型检查的好处:调用了不存在或不可访问的方法
领取专属 10元无门槛券
手把手带您无忧上云