前言: 博客开始记录了一系列C++笔记,但各章节太分散,且编辑格式不是很规范,不便于查看;现把各章节做一个汇总,准备放在一起,方便按知识点查看。汇总版的C++基础笔记包括上、下两部分。

文章目录

  • 程序的组成部分
  • 变量和常量
  • 表达式、语句、运算符
  • 调用函数
  • 控制程序流程
  • 使用数组和字符串存储信息
  • 创建基本类
  • 高级类
  • 创建指针
  • 开发高级指针
  • 创建引用
  • 高级引用和指针

程序的组成部分

C++是面向对象编程,有如下特点。1.封装、2.继承和重用、3.多态
1.封装,C++支持通过创建用户自定义的类型来封装属性,这种类型称为类。定义好的一个类是一个完全封装的实体,可以使用整个实体,也可以不使用。
2.继承和重用,C++通过继承来支持重用的概念。可将新类型声明为现有类型的扩展,新子类称为继承了现有类型。
3.多态,C++使用了称为函数多态和类多态的功能,多态指的是同一样东西有多种形态。

程序一般由以下4个部分组成:
1.预处理器编译指令:预处理器相当于编译前的代码编辑,每条编译指令都是一个命令,编译指令#include<…>告诉预处理器,将指定文件的全部内容加入到程序的指定位置。C++提供了一个标准源代码库,可以在程序中使用它们来执行有用的功能。

2.源代码行:每个C++程序都包含一个main()函数,程序运行时将自动调用main(),这和C语言一样。函数都以左大括号{开始,以右大括号}结束。

3.注释:使源代码的功能显而易见,可分为单行注释和多行注释;单行注释以两个斜杠(//)打头,只注释当前行;而多行注释以斜杠和星号/ *打头,并以星号和斜杠*/结尾,在/**/之间的所有内容都会被注释,不管它占据多少行。另外,关于多行注释,需要注意的是,不能嵌套,如:/*....../*......*/....*/,这种写法是错误的。

4.函数:函数由函数头和函数体组成,其中函数头包含三部分:函数的返回类型,函数名,函数接受的参数。当函数不返回值时,使用返回类型void,表示空;函数名是一个简短的标识符,描述了函数的功能;参数是当调用这个函数时,传递给这个函数的数据。程序从main()开始执行,并逐行执行源代码,当调用函数时,程序将转而执行该函数,函数执行完毕后,将返回到调用函数的代码行,函数可能返回值,也可能不返回值,但main()函数是一个例外,它总是返回一个整数。return语句导致函数结束,如果函数不包含return语句,将自动在函数体末尾返回void。在这种情况下,必须将函数的返回类型指定为void。


变量和常量

1、变量
变量是计算机内存中的一个位置,可以从这里存储和检索值。在C++中,当创建变量时,必须将变量的名称和存储的信息类型(如整数、字符或浮点数)告诉编译器,这就是变量的类型,有时也称为数据类型。通过变量的类型,编译器将知道需要预留多少内存空间,以存储变量的值。可以使用函数sizeof(),变在括号内指定类型名,获得变量类型的长度。
所有整型变量都又分为两种类型,无符号变量和有符号变量。除整型变量以外,C++还支持浮点数类型和字符。浮点变量可存储包含小数的值,而字符变量占用1字节,可存储ASCII字符集中的256个字符和符号之一。
定义变量要遵从变量名的命名规则,变量名可包含任何大小写字母、数字、下划线,但不能包含空格。
注意:C++区分大小写。C++保留了一些单词,不能将它们作为变量名,因为它们是C++使用的关键字。关键字如:if、while、for、main等,在编程时,字体会变色,很容易区分。
要给变量赋值,可使用运算符=,它被称为赋值运算符。
类型定义:当C++程序包含大量变量时,不断输入unsigned short既繁琐又容易出错,要创建现有类型的简洁表示,可使用关键字typedef,它表示类型定义(type definition)。
如:typedef unsigned short USHORT
这条语句创建了一个名为USHORT的类型定义,可在程序的任何地方使用它来代替unsigned short。
2、常量
与变量一样,常量也是一个内存位置,可在其中存储值;不同的是,常量的值会改变,C++支持两种类型的常量:字面常量和符号常量。字面常量是直接在需要的地方输入的值。如:long width=5;符号常量是用名称表示的常量,声明符号常量时,需要用关键字const,并在后面跟类型、名称和初始值。如:const int KILL_BONUS=5000;
定义常量,可使用编译指令#define来创建常量,这种方法起源于早期的c语言版本。如:#define KILLBONUS 5000,这种常量不需要指定类型,编译指令#define执行简单的文本替换,将代码中的KILLBOUNS都替换成5000,编译器只能看到替换后的结果。
枚举常量:在一条语句中创建一组常量,它们是使用关键字enum定义的,后面跟一组用逗号分隔的名称,这些名称放在大括号内,如:enum COLOR{ RED,BLUE,GREEN,WHITE,BLACK};这条语句创建了一组名为COLOR的枚举常量,其中包含5个名为RED,BLUE,GREEN,WHITE,BLACK的值。枚举常量值以0(对应于第一个常量)打头,其他常量依次加1,也可以使用赋值运算符指定枚举常量的值,如:enum COLOR{ RED=100,BLUE,GREEN=500,WHITE,BLACK=700};这条语句将RED设置为100,将GREEN设置为500,将BLACK设置为700,对于没有设置值的枚举常量,其值比它前面的成员大1,即BLUE为101,而WHITE为501。


表达式、语句、运算符

1、语句
所有C++都是由语句组成,语句是以分号结尾的命令。每条语句可独占一行也可以将多条语句放在一行,只要每条语句都以分号结尾即可。
在C++程序的源代码中,空格、制表符和换行符统称为空白。空白旨在让程序员方便阅读代码,编译器通常忽略它们。另外,注意,变量名不能包含空白。
2、表达式
表达式是语句中任何返回一个值的部分。如:z=x=y+13;
这条语句包含三个表达式:1、表达式y+13,其值被存储在变量x中。2、表达式x=y+13,它返回变量x的值,而该返回值被存储在变量z中。3、表达式z=x=y+13,它返回变量z的值,但该返回值没有存储到其他变量中。
3、运算符
运算符是导致编译器执行操作的符号,如赋值=、执行乘法运算*、除法运算/或其他数学运算。
3.1 赋值运算符
赋值运算符由赋值运算符、左操作数和右操作数组成,如:grade=95,注意:赋值=不等于等号==
3.2 数学运算符
数学运算符有五个:加法+、减法-、乘法*、除法/和求模%(也叫求余)运算符。注意:它和C语言一样,没有乘方运算符。
3.3 组合运算符
一个变量与一个值操作,并将结果赋给这个变量。组合运算符有自赋值加法运算符+=、自赋值减法运算符-=、自赋值除法运算符/=、自赋值乘法运算符*=和自赋值求模运算符%=。如:score+=10;与score = score + 10;等价。
3.4 递增递减运算符
递增运算符(++)和递减运算符(–)是将变量加1和减1。
这里有个区别就是运算符是放在变量名前面和放在变量名后面的区别,它们之间的效果不一样。
如++count(前缀运算符)和count++(叫做后缀运算符)之间的区别。它们在简单语句的效果相同,都是将变量count加1。但是,如在下面这例子中就可以看到二者的区别了:int x=5; int sum=++x;和int x=5; int sum=x++;在两个中,x最后的值都是6,但sum的值却不一样,第一个是6,第二个是5。
3.5 关系运算符
关系运算符用于比较,以判断一个数是大于、等于或小于另一个数,返回的结果为true或者是false。关系运算符有相等(==)、不等(!=)、大于(>)、大于等于(>=)、小于(<)、小于等于(<=)。
3.6 逻辑运算符
通过逻辑运算符,可测试多个条件,返回结果也是true或者false。逻辑与运算符(&&):连接两个表达式,当它们都为true时,结果为true。逻辑或运算符(||):连接两个表达式,当它们两个有一个为true时,结果为true。非运算符(!):对表达式求反,当表达式为false时,结果为true。

注意:在C++中0被认为是false,而其他值被认为是true。所以负数也被认为是true。


调用函数

函数是程序的一部分,可对数据执行操作并返回一个值,每个C++程序至少有一个函数:程序运行时自动调用的main()。这个函数可包含调用其他函数的语句,而这些函数中也可能调用其他函数。
在编写函数的代码前,必须声明它。函数声明将函数的名称、函数返回类型和函数输入参数的类型告诉编译器。函数声明也叫原型,不包含任何代码,是单条语句,以分号结尾。参数列表列出了所有参数及其类型,并用逗号将他们分开。如: int findArea(int length, int width);函数可返回任何C++数据类型,如果函数不返回值,就应该将返回类型声明为void。
局部变量:在函数内创建的变量称为局部变量,因为它只存在于函数中,当函数返回后,其所有局部变量都不能供程序使用。局部变量的创建方式与其他变量相同,函数收到的参数也被视为局部变量。
全局变量:在函数(包括函数main())外面定义的C++变量,这样的变量称为全局变量。它在程序的任何地方都可用。注意:在编码的过程中应该多用局部变量,少用全局变量,因为它们会导致错误难以查找。
函数的返回值,在同一个函数中,可包含多条return语句。
默认函数参数,如果函数有多个参数,将根据参数的顺序指定默认值。可给任何参数指定默认值,但有一项需注意:如果某个参数没有默认值,那么它前面的任何参数都不能有默认值。
函数重载,返回参数类型相同,函数名相同,输入参数不同(参数的类型不同或参数数量不同都可),这样的函数称为函数重载。如:int store(int ,int);和int store(long, long);和int store(long);函数重载也被称为函数多态。
内联函数,如果函数包含的语句很少,就可以通过避免跳转来提高效率,在这种情况下,通过避免函数调用,程序的运行速度将更快。在声明C++函数时,如果使用了关键字inline,编译器将不会创建该函数,而将代码直接复制到调用它的地方,就像在调用它的地方直接输入了函数的语句一样。 如:inline int double(int);关键字inline提示编译器,你希望将该函数嵌入在调用它的地方。
注意:
在函数内部对参数进行修改时,不会影响到调用它的函数。因为,在默认情况下,参数是按值传递的,这意味着函数接受的参数实际上是原始值的备份,即使变量名相同也一样。
int findArea(int width,int length =1);
int findArea(int size);这是同一个函数的两个不同重载版本的声明,声明将能通过编译,但是如果使用一个参数调用了findArea(),就将出现编译错误,指出无法确定应该调用findArea(int,int)还是findArea(int)。


控制程序流程

while循环不断运行一个代码块,直到条件不再为true。如果条件永远不为true,代码块一次也不会运行。
相反,do-while循环会运行代码块一次,即使检查的条件永远不为true。
for循环包含初始化部分、检查部分和操作部分。这些部分使得可在for语句中创建计数器变量以及检查和修改该变量的值。
使用continue和break语句可编写出复杂循环,continue语句直接进入下一次循环迭代,而break语句结束整个循环。
switch语句让检查同一个变量的多种可能取值变得更简单,虽然使用一系列if和if-else条件也可以实现这样的目标,但switch语句更容易开发和调试。注意,在switch语句中,总是应该包含default部分,即使没有理由使用它,这是一种良好的编程习惯。可使用default部分显示一条错误消息,它表明表达式的值出乎意料,不与任何case部分相匹配。另外,每一个case部分的结尾都应该添加break语句。


使用数组和字符串存储信息

数组是一系列类型相同的相关数据,可将数组视为一系列数据存储单元,其中每个存储单元都是数组的一个元素。
要声明数组,可依次指定数据类型、数组名以及用方括号括起来的元素数,如:long peaks[25];数组元素的编号也称为下标,数组元素从0开始编号,所有上例中,元素的下标最大为24。
字符数组,字符串是一系列字符,在C++中,字符串是以空字符结尾的字符数组,空字符是编码为‘\0’的特殊字符。可像其他数组那样声明并初始化字符串:
char yum[ ] = {'z','o','m','b','i','e',' ','e','a','t',' ','b','r','a','i','n','s','\0'};
最后用’\0‘空字符来结束字符串的输入。也可以用简洁的方式:char yum[ ]="zombie eat brains";这种初始化方法不需要使用空字符,而是由编译器自动添加。字符串"zombie eat brains"占用18个字节(包括空字符在内),即一个字符占用一个字节。
C++从C语言那里继承了一个处理字符串的函数库,要将这个库加入到程序中,可包含头文件string.h。#include <string.h>


创建基本类

前面书中介绍的内容和C语言的差不多,从这一章开始才是真正意义上的C++部分的学习。
在C++中,可以自己定义类型,以模拟要解决的问题。但是要声明一个新类型,就得创建一个类,类是新类型的定义。
C++类是一个模板,可用于创建对象。定义类后,便可以像使用其他类型那样使用它创建的对象。类是一系列捆绑在一起的变量和函数,其中的变量也可以包括其他类型或者其他类。将变量和函数捆绑在一起称为封装。通过封装,可以让其他程序能够使用类,而无需知道他的工作原理。类中的变量称为成员变量,类中的函数可以使用或修改成员变量,它们被称为类的成员函数或方法。
要声明类,可使用关键字class,并在后面加上有关成员变量和成员函数的信息。如:

class Tricycle
{
public:
unsigned int speed;
unsigned int wheelSize;
pedal();
brake();
};

上述代码创建一个Tricycle类,注意,上述声明不会给Tricycle类分配内存,只有创建了对象才会分配内存,创建对象的方法是:Tricycle Wichita;这条语句就创建了一个名为wichita的Tricycle对象。
创建对象后,可使用句点运算符(.)类访问其成员函数和成员变量。如:wichita.speed或者调用成员函数wichita.pedal();
对于刚刚声明的类的成员函数,都必须定义,也叫做实现。成员函数的定义以类名打头,然后是作用域解析运算符(::)和函数名,如:

void Tricycle ::pedal()
{
std::cout << "Pedaling trike\n";
}

类有两个特殊的函数,构造函数和析构函数,前者是每次实例化对象时都将调用它,构造函数与类同名,且没有返回值。而后者是负责执行清理工作并释放分配给对象的内存。析构函数的名称总是由颚化符号(~)和类名组成的,析构函数不接受任何参数,也不返回值。在用户没有声明构造函数或者析构函数的情况下,编译器会自动提供默认构造函数或析构函数,它们没有参数且函数体都为空,不执行任何操作。


高级类

常量成员函数:在声明的类中,被关键字const所修饰的成员函数就叫做常量函数,这表明它不会修改任何类成员变量的值。如果将函数声明为常量函数,但其实现修改了成员变量的值,编译器就将报错。如:

class Tricycle
{
public:
int speed =6;
void setSpeed( int speed) const
{
speed++; //修改成员变量的值,编译器会报错
}
}

组织类声明和函数定义
在C++程序的源代码中,类的定义和实现通常是分开的。一般情况下,我们将类的声明放在头文件中,其文件名与源代码文件相同,但扩展名为.hpp(或不那么常见的.h或.hp)。如:我将Tricycle类的声明放在文件Tricycle.hpp中,那么类函数的定义将放在位于Tricycle.cpp中,通过使用预处理编译器指令,可在.cpp文件中包含头文件:#include "Tricycle.hpp",将它们分开的原因是,使用类的用户不需要关心类实现的细节。
最后一点,在创建复杂类时,经常将简单类作为其成员变量。这在上一章也提到过。


创建指针

指针,在c语言中也存在,这一章提到的内容也和c语言中的差不多。大家都知道,变量是可存储一个值的对象,整型变量存储一个数字,字符变量存储一个字母,而指针变量就是存储内存地址的。当要获取一个内存的地址信息,可以使用地址运算符&。
在指针中存储地址
如果将指针初始化为0或NULL,以后必须将变量的地址赋值给它,如:

int age = 40;
int *page = 0;
page = &age; //把age变量的地址赋值给指针变量page。

这里顺便讲一下间接访问,它是指访问指针存储的地址处的值,指针提供了一种间接获取值的方式。间接运算符*也被称为解除引用运算符。对指针解除引用时,将获取指针存储的地址处的值。接上例:int yourage = age;和int yourage = *page;是一个意思,指针page前面的间接运算符*表示“存储在…处的值”,这条赋值语句的意思是从page指向的地址处获取值,并将它赋值给yourage。
指针最常用于完成如下三项任务:管理堆中的数据,访问类的成员数据和成员函数,按引用将变量传递给函数。
栈和堆
程序员通常需要处理如下5个内存区域:全局名称空间,堆,寄存器,代码空间和栈。局部变量和函数参数存储在栈中,代码存储在代码空间中,而全局变量存储在全局名称空间中,寄存器用于管理内存,如跟踪栈顶和指令指针。几乎余下的所有内存都分配给了堆,堆有时也被称为自由存储区。每当函数返回时,都会清理栈,而只有到程序结束后才会清理堆,因此使用完预留的内存后,需要负责将其释放。让不再需要的信息留在堆中称为内存泄露。
堆的优点在于,在显示释放内存前,预留的内存始终可用。如果在函数中预留堆中的内存,在函数返回后,该内存仍然可用。
在C++中,要分配堆中的内存,可使用关键字new,并在它后面指定要为之分配内存的对象的类型,好让编译器知道需要多少内存。关键字new返回一个内存地址,必须将其赋值给一个指针。如:

int  *pPointer;
pPointer = new int;
*pPointer = 72; //将72赋给pPointer指向的堆内存区域

使用完分配的内存区域后,必须对指针调用delete,将内存归还给堆。因为指针是局部变量,这不同于它指向的堆内存,当声明指针的函数返回时,指针不在作用域中,因此被丢弃,然而,使用new运算符分配的堆内存不会自动释放,这些内存将不可用,这就被称为内存泄露。要将内存归还给堆,可使用关键字delete,如:delete pPointer;删除指针时,实际上是释放了其地址存储在指针中的内存,这被称为将指针指向的内存归还给了堆。指针还是指针,可重新给他赋值。删除指针时,应将其设置为NULL。注意:程序中的每个new调用都必须有对应的delete调用,应跟踪哪个指针指向了内存区域,并在使用完后将内存释放。


开发高级指针

前面一章讲到怎样在堆中分配内存,这一章主要讲怎样在堆中创建对象(实例化类的对象),其原理是一样的,同样是利用关键字new,delete。如:
当定义了类型Cat后,便可声明一个指向这种对象的指针,并在堆实例化一个Cat对象,语法如下:Cat *pcat = new Cat;这将调用默认构造函数----不接受任何参数的构造函数。对指向堆中对象的指针调用delete时,将调用对象的析构函数,然后释放内存。
使用指针访问数据成员
对于在栈中创建的Cat对象,可使用句点运算符(.)来访问其成员数据和成员函数;要访问堆中的Cat对象,必须对指针解除引用,并对指针指向的对象使用句点运算符。因此,要访问成员函数Getage(),可编写如下代码:(*pcat).Getage();也可以使用间接访问运算符:指向运算符(->),上句代码可变为:pcat->Getage();
this指针
每个类成员函数都有一个隐藏的参数:this指针,它指向相应的对象。this指针存储了当前对象的内存地址,可成为功能强大的工具。通常,在成员函数中,无需使用this指针来访问当前对象的成员变量,但如果愿意,可以显式地使用this指针。
悬摆指针
悬摆指针是导致bug的罪魁祸首之一,对指针调用delete后,如果没有重新赋值就使用它,将导致悬摆指针。悬摆指针又称野指针或迷失指针。
const指针
声明指针时,可在类型前、类型后或两个地方使用const关键字。如:

const int  *pOne;    //pOne指向整型常量的指针,即使用该指针不能修改它指向的值
int  *  const pTwo;  //pTwo是指向整型的常量指针,可修改指向的整型变量,但pTwo不能指向其他变量,不能给常量指针重新赋值
const int * const pThree; //pThree是一个指向整型常量的常量指针,不能修改它指向的值,也让它指向其他变量。

如果声明了一个指向常量对象的指针,那么使用该指针只能调用常量函数。将对象声明为常量时,实际上是将this声明为指向常量对象的指针,常量this指针只能用于调用常量成员函数。


创建引用

这一章主要讲引用,其用处和前面讲的指针差不多,但用法要比指针容易些,总的来讲,引用就是一个变量的别名。创建引用时,使用另一个对象(目标)的名称来初始化它,从此以后,该引用就像是这个目标的另一个名称,对引用执行的任何操作实际上针对的就是目标。指针和引用的区别就是:指针是存储另一个对象的地址的变量,而引用是对象的别名。
创建引用
要创建引用,需要指定目标对象的类型、引用运算符(&)和引用名。如:int &rSomeRef = someint;这句语句的含义是,rSomeRef是一个int引用,被初始化为指向someint。
如果声明了引用但没有初始化,就将导致编译器出错,引用必须初始化。注意:这里的引用运算符(&)和前面所讲的地址运算符(&)是同一个符号,根据程序的上下文区分。
将地址运算符用于引用如:

int  &rSomeRef = intone;
std ::cout <<&intone;    //输出变量intone的地址
std ::cout <<&rSomeRef;  //也会输出变量intone的地址,而不是rSomeRef的地址

在C++中,无法获取引用本身的地址,因为它不像指针或其他变量的地址那样有意义。引用是在创建时初始化的,总是目标的同义词,通常,在使用引用时,不将地址运算符用于它,而像使用目标变量那样使用引用,不能给引用重新赋值,他始终是目标变量的别名。
可引用的目标
可引用任何对象,包括用户自己定义的对象。注意:我们创建的是指向对象的引用,而不是指向类或数据类型(如int)的对象。所以以下代码是错的:
int &rIntRef = int; //错误
应该改为:

int  age=20;
int  &rIntRef = age;

同样,当我们自己创建了cat类后,这些代码也是错的:
cat &rCatRef = cat; //错误
应该改为:

cat  Frisky;
cat  &rCatRef = Frisky;

可以像使用对象那样使用指向对象的引用:访问成员数据和成员函数,使用类成员访问运算符(.),如:rCatRef.agerCatRef.voice()等。
空指针和空引用
指针未初始化或被删除时,应将NULL赋给它,但对于引用来说,引用不能为空,让引用指向空对象的程序是非法的。
按引用传递函数参数
在第五章讲到,函数的参数是按值传递(对象值的备份)的,返回的结果不能修改原来的值,但按引用传递的方式就不同了,它有两种方式:使用指针和使用引用。他们的语法不同,但效果相同:不是在函数作用域内创建对象值的备份,而是将原始对象传递给函数。通过按引用传递对象,可让函数修改指向的对象。使用指针,传递的实际上是对象的地址,因此函数可直接操作该地址处的值。
如果函数是使用指针传递参数,则调用函数时,参数为变量的地址(如:&i);如果函数是是使用引用传递参数,则调用函数时,参数为变量(如:i)。


高级引用和指针

前面讲到,每次按值将对象传入函数时,都将创建该对象的一个备份。每次按值从函数返回一个对象时,也将创建其备份。对于用户创建的大型对象,备份的代价很高。这将增加程序占用的内存量,而程序的运行速度也将会变慢。按引用传递避免了创建备份以及调用复制构造函数,所以它的效率会更高。
但有一个非常重要的问题是,虽然将指针传递给函数的效率更高,但很危险。如果不想要函数修改对象的值,即要同时获得按值传递的安全性和按引用传递的效率,就必须传递一个指向对象的const指针,这可以禁止对对象调用任何非常量成员函数,从而禁止修改该对象。
什么情况下使用引用以及什么情况下使用指针
一般而言,C++程序员更喜欢使用引用而不是指针,因为它们更清晰,使用起来更容易。然而,引用不能重新赋值,如果需要依次指向不同的对象,就必须使用指针。引用不能为NULL,因此如果要指向的对象可能为NULL,就必须使用指针,而不能使用引用。如果要从堆中分配动态内存,也要使用指针。
程序在堆中分配内存时,将返回一个指针。必须一直让某个指针指向这块内存,因为指针丢失后,便无法释放该内存,进而导致内存泄露。如果我们要编写这样的函数,即它需要分配内存块并将其传递给调用它的函数,应该考虑修改接口:让发出调用的函数分配内存,然后按引用将其传递给被调用的函数,这样,便可以做到在哪个函数中分配内存,就在哪个函数中释放内存了。
问:为何要从函数按值返回?
答:如果返回的是局部对象,即在这个函数中所定义的对象(除去在堆中所定义的对象),必须按值返回,否则返回的引用将指向不存在的对象。

C++基础笔记——汇总版(上)相关推荐

  1. Java零基础笔记自用版(一)

    系列文章目录 一.Java零基础笔记自用版(一) 目录 系列文章目录 前言 一.⭐️Java概述 二.⭐️变量 三.⭐️运算符 四.⭐️控制结构 五.⭐️数组.排序.查找 写在最后 前言 最近在学习J ...

  2. 【最全】java面试题基础--完整汇总版

    语言特性 12 Q1:Java 语言的优点? ① 平台无关性,摆脱硬件束缚,"一次编写,到处运行". ② 相对安全的内存管理和访问机制,避免大部分内存泄漏和指针越界. ③ 热点代码 ...

  3. SQL Server 数据库基础笔记分享(上)

    前言 本文是个人学习SQL Server 数据库时的以往笔记的整理,内容主要是对数据库的基本增删改查的SQL语句操作和约束,视图,存储过程,触发器的基本了解. 注:内容比较基础,适合入门者对SQL S ...

  4. 小猫的java基础知识点汇总(上)

    1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致. 2.short ...

  5. android拓展笔记本,有道笔记Android版上线,拓展移动终端产品布局

    在大家的翘首企盼下,有道笔记Android版今天终于上线了!广大G粉从今天起也可以在Android系统手机上使用有道笔记获得高效的个人知识管理体验. 有道笔记Android版拥有和桌面版.网页版一致的 ...

  6. 计算机应用基础期末考试电大,(电大)期末考试2017年广播电视大学网考《计算机应用基础》重点复习题目汇总版(理论题及操作题)...

    2017年度最新广播电视大学(电大)期末考试网考<计算机应用基础>重点复习题目整理汇总版(理论题及操作题) 1.一般认为,世界上第一台电子数字计算机诞生于1946年. 2.计算机当前已应用 ...

  7. 前端基础知识整理汇总(上)

    前端基础知识整理汇总(上) HTML页面的生命周期 HTML页面的生命周期有以下三个重要事件: 1.DOMContentLoaded -- 浏览器已经完全加载了 HTML,DOM 树已经构建完毕,但是 ...

  8. 高二上计算机知识点,高二会考计算机基础知识汇总.doc

    高二会考计算机基础知识汇总.doc 计算机应用基础试卷结构与题型试题分为知识题和操作题两大类,其中知识题约占40,操作题约占60.试卷内容比例为计算机基础知识和操作系统及其应用约占30.文字编辑.电子 ...

  9. MySQL学习笔记——尚硅谷李玉婷经典版MySQL基础笔记(一)

    MySQL学习笔记--尚硅谷李玉婷经典版MySQL基础笔记(一) MySQL学习笔记目录 MySQL学习笔记--尚硅谷李玉婷经典版MySQL基础笔记(一) 一.基础知识 1.MySQL的语法规范 2. ...

  10. 金融市场基础知识-全书读书笔记汇总

    金融市场基础知识-全书读书笔记汇总 参考: https://mp.weixin.qq.com/s?__biz=MzUxNDc2ODk1Mw==&mid=2247484311&idx=1 ...

最新文章

  1. 拦截导弹(最长递增子序列)
  2. [ASM C/C++] C语言数组
  3. Android HelloWorld 例子
  4. 【PAT甲级 排序】1012 The Best Rank (25 分) C++ 全部AC
  5. 【土地评价与土地管理】教案 第一章:土地评价要素的选择
  6. 字符串字符和数字分割
  7. Flowable 数据库表结构 ACT_HI_PROCINST
  8. english 2012020604
  9. javaWeb项目中web.xml的xsd( XML Schemas Definition)文件
  10. C++Debug Assertion Failed!到底出错在哪里?
  11. 设计模式-Adapter模式(适配器模式)
  12. 机载激光雷达原理与应用科普(一)
  13. 深入浅出mysql_深入浅出MySQL读书笔记(一)
  14. Idear中文文件乱码处理_大批量乱码
  15. python02 函数 等额本金贷款
  16. 用树莓派(等)为 USB Midi 键盘增添连接方式
  17. 证据确凿!360,彻头彻尾的木马?
  18. C++ dpi,px,cm,mm换算心得,以及以a4纸计算为例,其它大家各自换算
  19. skywalking和jpa冲突
  20. DAY2-Ubuntu主题与终端的美化

热门文章

  1. 在日本的软件工程师之路
  2. chromecast 协议_如何设置新的Chromecast
  3. 关于程序组团队建设的几点想法
  4. 基于堡垒主机概念的运维审计系统
  5. 【验证码识别】OpenCV挑战腾讯防水墙滑动验证码
  6. matlab怎么表示x的平方,用matlab算多项式x平方
  7. 动态规划练习一之最低通行费
  8. WWF中Conditioned Activity Group的子Activity扩展CAG的WhenCondition属性代码解析
  9. 用Java来解析torrent文件
  10. iOS程序员必读之热门书单