C++个人学习笔记

注释:
1.单行注释  //注释
2.多行注释  /*注释*/

main是一个程序的入口,每个程序都必须有这么一个函数,有且仅有一个。

变量创建的语法:
数据类型 变量名 = 变量初始值;
int a = 10;

常量:
作用:用于记录程序中不可更改的数据
C++定义常量两种方式
    1.#define宏常量:
通常在文件上方定义,表示一个常量
    2.const修饰的变量 
通常是在变量定义前加关键字const,修饰该变量为常量,不可修改

关键字:
作用:关键字是C++中预先保留的单词(标识符)
#在定义变量或者常量时候,不要用关键字

标识符命名规则:
作用:C++规定给标识符(变量、常量)命名时,有一套自己的规则
#标识符不能是关键字
#标识符只能由字母、数字、下划线组成
#第一个字符必须是字母或下划线
#标识符中字母区分大小写
建议:给标识符命名时,争取做到见名知意的效果,方便自己和他人的阅读

数据类型:  
C++规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存
整型:整型变量表示的是整数类型的数据
C++中能够表示整型的类型有以下几种方式,区别在于所占内存空间不同:
short  (2字节)
int  (4字节)
long  (4字节)
long long  (8字节)

sizeof关键字:
作用:利用sizeof关键字可以统计数据类型所占内存大小
语法:sizeof( 数据类型 / 变量 )

实型(浮点型)
作用:用于表示小数
浮点型变量分为两种:
1.单精度float
2.双精度double
#默认情况下,输出一个小数,会显示出6位有效数字

字符型:
作用:字符型变量用于显示单个字符
语法:char  ch  =  ‘a’;
注意1:在显示字符型变量时,用单引号将字符括起来,不要用双引号
注意2:单引号内只能有一个字符,不可以是字符串
#创建字符型变量时候,要用单引号
#创建字符型变量时候,单引号内只能有一个字符
1.C和C++字符型变量只占用1个字节
2.字符型变量并不是字符本身放到内存中存储,而是将对应的ASCII编码放入到存储单元

转义字符:
作用:用于表示一些不能显示出来的ASCII字符
\n:换行(LF),将当前位置移到下一行开头
\t:水平制表(HT)  (跳到下一个TAB位置)
\\:代表一个反斜线字符“\"

字符串型:
作用:用于表示一串字符
两种风格:
    1.C风格字符串:char变量名【】=”字符串值“
    1.C++风格字符串:string变量名=”字符串值“
#include <string>  //用C++风格字符串时候,要包含这个头文件

布尔类型bool:
作用:布尔数据类型代表真或假的值
bool类型只有两个值:
true  —  真(本质是1)
false  —  假(本质是0)
bool类型占1个字节大小

数据的输入:
作用:用于从键盘获取数据
关键字:cin
语法:  cin  >>  变量

算术运算符:
作用:用于处理四则运算
#两个整数相除,结果依然是整数,将小数部分去除
#两个数相除,除数是不可以为0的
#两个小数可以相除
#运算的结果也可以是小数
#取模运算本质,就是求余数(a%b)
#两个数相除除数不可以为0,所以也做不了取模运算
#两个小数是不可以做取模运算的
总结:只有整型变量可以进行取模运算

前置递增与后置递增的区别:
前置递增:先让变量+1,然后进行表达式运算;
后置递增:先进行表达式运算,后让变量+1;

赋值运算符:
作用:用于将表达式的值赋给变量
赋值运算符包括以下几个符号:
=(赋值)
+=(加等于)
-=(减等于)
*=(乘等于)
/=(除等于)
%=(模等于)

比较运算符:
作用:用于表达式的比较,并返回一个真值或假值
比较运算符有以下符号:
==(相等于)
!=(不等于)
<(小于)
>(大于)
<=(小于等于)
>=(大于等于)

逻辑运算符:
作用:用于根据表达式的值返回真值或假值
逻辑运算符有一下符号:
!    术语(非)    示例(!a)    结果(如果a为假,则!a为真;如果a为真,则!a为假。)
&&  术语(与)    示例(a&&b)结果(如果a和b都为真,则结果为真,否则为假。)
||      术语(或)    示例(a||b)    结果(如果a和b有一个为真,二者都为假时,结果为假。)

程序流程结构:
C/C++支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构
1.顺序结构:程序按顺序执行,不发生跳转
2.选择结构:依依据条件是否满足,有选择的执行相应功能
3.循环结构:依据条件是否满足,循环多次执行某段代码

选择结构:
if语句:
作用:执行满足条件的语气
if语句的三种形式:
1.单行格式if语句
2.多行格式if语句
3.多条件的if语句

1.单行格式if语句:if(条件){条件满足执行的语句}
#if条件后面不用加分号  

2.多行格式if语句:if(条件){条件满足执行的语句}else{条件不满足执行的语句}

3.多条件的if语句:if(条件1){条件1满足执行的语句}else  if(条件2){条件2满足执行的语句}…else{都不满足执行的语句}

嵌套if语句:
在if语句中,可以嵌套使用if语句,达到更精确的条件判断

三目运算符:
作用:通过三目运算符实现简单的判断
语法:
表达式1  ?表达式2  : 表达式3
解释:
如果表达式1的值为真,执行表达式2,并返回表达式2的结果;
如果表达式1的值为假,执行表达式3,并返回表达式3的结果。

switch语句:
作用:
执行多条件分支语气
switch(表达式)

{

        case  结果1:执行语句;break;
        case  结果2:执行语句;break;


if  和  switch区别:
switch  缺点:判断时候只能是整型或者字符型,不可以是一个区间;
switch  优点:结构清晰,执行效率高;

循环结构:
while循环语句;
作用:满足循环条件,执行循环语句
语法:while(循环条件){循环语句}
解释:只要循环条件的结果为真,就执行循环语句


        ……

        default:执行语句;break;
}
注意:在执行循环语句时候,程序必须提供跳出循环的出口,否则出现死循环
break:可以利用该关键字来退出当前循环
srand((unsigned  int)time(NULL));  //添加随机数种子,作用是利用当前系统时间生成随机数,防止每次随机数都一样
#include<ctime>  //time系统时间头文件


do…while循环语句:
作用:满足循环条件,执行循环语句
语法:do{  循环语句  } while(循环条件);
总结:与while的区别在于do…while会先执行一次循环语句,再判断循环条件


for循环语句:
作用:满足循环条件,执行循环语句
语法:for(起始表达式;条件表达式;末尾循环体){  循环语句;}
注意:for循环中的表达式,要用分号进行分隔
总结:while,do…while,for都是开发中常见的循环语句,for循环结构比较清晰,比较常用

跳转语句:
break语句:
作用:用于跳出选择结构或者循环结构
break使用的时机:
1.出现在switch条件语句中,作用是终止case并跳出switch
2.出现在循环语句中,作用是跳出当前的循环语句
3.出现在嵌套循环中,跳出最近的内层循环语句

continue 语句:
作用:在循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环
注意:continue并没有使整个循环终止,而break会跳出循环

goto 语句:
作用:可以无条件跳转语句
语法:  goto  标记;
解释:如果标记的名称存在,执行到goto语句时,会跳转到标记的位置
注意:在程序中不建议使用goto语句,以免造成程序流程混乱

数组:
概述:所谓数组,就是一个集合,里面存放了相同类型的数据元素
特点1:数组中的每个数据元素都是相同的数据类型
特点2:数组是由连续的内存位置组成的

一堆数组:
一堆数组定义方式:
一维数组定义的三种方式:
1.数据类型    数组名【  数组长度  】;
2.数据类型    数组名【  数组长度  】=  {  值1,值2  …};
3.数据类型    数组名【  】  =  {  值1,值2  …};

数组特点:放在一块连续的内存空间中,数组中每个元素都是相同数据类型
下标:我们可以通过下标访问数组中的元素
总结1:数组名的命名规范与变量名命名规范一致,不要和变量重名
总结2:数组中下标是从0开始索引

一维数组数组名:
一维数组名称的用途:
1.可以统计整个数组在内存中的长度
2.可以获取数组在内存中的首地址

冒泡排序:
作用:最常用的排序算法,对数组内元素进行排序
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素做同样的工作,执行完毕后,找到一个最大值。
3.重复以上的步骤,每次比较次数-1,直到不需要比较。

二维数组:
二维数组就是在一堆数组上,多加一个维度。

二维数组定义方式:
二维数组定义的四种方式:
1.数据类型    数组名【  行数  】【  列数  】;
2.数据类型    数组名【  行数  】【  列数  】 = { {数据1,数据2 } , {数据3,数据4} };
3.数据类型    数组名【  行数  】【  列数  】 = {  数据1,数据2,数据3,数据4 };
4.数据类型    数组名【  】【  列数  】 = {  数据1,数据2,数据3,数据4 };
建议:以上4种定义方式,利用第二种更加直观,提高代码的可读性
总结:在定义二维数组时,如果初始化了数据,可以省略行数

二维数组数组名:
#查看二维数组所占内存空间
#获取二维数组首地址

&:取址符


函数:
概述:
作用:将一段经常使用的代码封装起来,减少重复代码;
一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能;
函数的定义:
函数的定义一般主要有5个步骤:
1.返回值类型(一个函数可以返回一个值。在函数定义中)
2.函数名(给函数起个名称)
3.参数列表(使用该函数时,传入的数据)
4.函数体语句(花括号内的代码,函数内需要执行的语句)
5.return 表达式(和返回值类型挂钩,函数执行完后,返回相应的数据)
语法:
返回值类型    函数名    (参数列表)
{
               函数体语句

               return 表达式

}

函数的调用:
功能:使用定义好的函数
语法:函数名(参数)
总结:函数定义里小括号内称为形参,函数调用时传入的参数称为实参

值传递:
#所谓传递,就是函数调用时实参将数值传入给形参
#值传递时,如果形参发生,并不会影响实参
总结:值传递时,形参是修饰不了实参的

常见的函数样式有4种:
1.无参无返
2.有参无返
3.无参有返
4.有参有返

函数的声明:
作用:告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。
#函数的声明可以多次,但是函数的定义只能有一次

函数的分文件编写:
作用:让代码结构更加清晰
函数分文件编写一般有4个步骤:
1.创建后缀名为 .h 的头文件
2.创建后缀名为 .cpp 的源文件
3.在头文件中写函数的声明
4.在源文件中写函数的定义


指针:
指针的基本概念:
指针的作用:可以通过指针间接访问内存
#内存编号是从0开始记录的,一般用十六进制数字表示
#可以利用指针变量保存地址

指针变量的定义和使用:
指针变量定义语法:  数据类型 * 变量名;

指针所占内存空间:
在32位操作系统下,不管是什么数据类型,指针是占4个字节空间大小;
在64位操作系统下,不管是什么数据类型,指针是占8个字节空间大小;

空指针和野指针:
空指针:指针变量指向内存中编号为0的空间
用途:初始化指针变量
注意:空指针指向的内存是不可以访问的
野指针:指针变量指向非法的内存空间
总结:空指针和野指针都不是我们申请的空间,因此不要访问。

const 修饰指针:
const 修饰指针有三种情况:
1.const 修饰指针……常量指针
#const 修饰的是指针,指针指向可以改,指针指向的值不可以更改
2.cosnt 修饰常量……指针常量
#const 修饰的是常量,指针指向不可以改,指针指向的值可以更改
3.const 即修饰指针,又修饰常量
#const 既修饰指针又修饰常量
技巧:看const 右侧紧跟着的是指针还是常量,,是指针就是常量指针,是常量就是指针常量

指针和数组:
作用:利用指针访问数组中元素

指针和函数:
作用:利用指针作函数参数,可以修改实参的值
总结:如果不想修改实参,就用值传递,如果想修改实参,就用地址传递


结构体:
结构体基本概念:
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型

结构体定义和使用:
语法:struct  结构体名  {  结构体成员列表  };
通过结构体创建变量的方式有三种:
#struct  结构体名  变量名
#struct  结构体名  变量名={成员1值,成员2值…}
#定义结构体是顺便创建变量
总结1:定义结构体时的关键字是struct,不可省略;
总结2:创建结构体变量时,关键字struct可以省略;
总结3:结构体变量利用操作符“.”访问成员;

结构体数组:
作用:将自定义的结构体放入到数组中方便维护
语法:struct    结构体名  数组名  [元素个数]  =  {  { } , { } ,… { }  };

结构体指针:
作用:通过指针访问结构体中的成员
#利用  ->  操作符可以通过结构体指针访问结构体属性

结构体嵌套结构体:
作用:结构体中的成员可以是另一个结构体
例如:每个老师辅导一个学员,一个老师的结构体中,记录一个学生的结构体
总结:在结构体中可以定义另一个结构体作为成员,用来解决实际问题

结构体做函数参数:
作用:将结构体作为参数向函数中传递
传递方式有两种:
#值传递
#地址传递
总结:如果不想修改主函数中的数据,用值传递,反之用地址传递

结构体中const使用场景:
作用:用const来防止误操作
总结:
#将函数中的形参改为指针,可以减少内存空间,而且不会复制新的副本出来;
#加入const之后,一旦有修改的操作就会报错,可以防止我们的误操作

随机数代码:int  random = rand()%  数值  +  数值;
随机数种子:
头文件:#include  <ctime>
代码:srand ( ( unsigned   int ) time ( NULL ) ) ;


system(”pause“);  //按任意键下一步;
system(”cls“);     //清屏;

内存分区模型:
C++程序在执行时,将内存大方向划分为4个区域:
#代码区:存放函数体的二进制代码,由操作系统进行管理的;
#全局区:存放全局变量和静态变量以及常量;
#栈区:由编译器自动分配释放,存放函数的参数值等;
#堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收;
内存四区意义:
不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程

程序运行前:
在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域
代码区:
#存放CPU执行的机器指令;
#代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可;
#代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令;
全局区:
#全局变量和静态变量存放在此;
#全局区还包括了常量区,字符串常量和其他常量也存放在此;
#该区域的数据在程序结束后由操作系统释放;
总结:
#C++在程序运行前分为全局区和代码区;
#代码区特点是共享和只读;
#全局区中存放全局变量、静态变量、常量
#常量区中存放 const 修饰的全局变量  和  字符串变量;
全局区:
全局变量;
静态变量    static 关键字
常量 { 字符串常量、const 修饰的全局变量(全局常量)};
不在全局区中:
局部变量;
const 修饰的局部变量(局部常量);

程序运行后:
栈区:
由编译器自动分配释放,存放函数的参数值、局部变量等;
注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放;
堆区:
由程序员分配释放,若程序员不释放,程序结束时由操作系统回收;
在C++中主要利用new在堆区开辟内存;
总结:
#堆区数据由程序员管理开辟和释放;
#堆区数据利用new关键字进行开辟内存;

C++中利用new操作符在堆区开辟数据:
#堆区开辟得数据,由程序员手动开辟,手动释放,释放利用操作符delete;
语法:new  数据类型;
#利用new创建的数据,会返回该数据对应得类型得指针;
#释放数组的时候,要加【】才可以;

引用的基本使用:
作用:给变量起别名
语法:数据类型  &别名  =  原名;
引用注意事项:
#引用必须初始化;
#引用在初始化后,不可以改变;

引用做函数参数:
作用:函数传参时,可以利用引用的技术让形参修饰实参;
优点:可以简化指针修改实参;
总结:通过引用参数产生的效果同按地址传递是一样的。引用的语法更清楚简单。

引用做函数返回值:
作用:引用是可以作为函数的返回值存在的;
注意:不要返回局部变量引用;
用法:函数调用作为左值;

引用的本质:
本质:引用的本质在C++内部实现是一个指针常量
结论:C++推荐用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了;

常量引用:
作用:常量引用主要用来修饰形参,防止误操作;
#在函数形参列表中,可以加 const 修饰形参,防止形参改变实参;

函数提高:
函数默认参数:
在C++语法中,函数的形参列表中的形参是可以有默认值的。
语法:返回值类型    函数名    (参数 = 默认值){ }
注意事项:
1、如果某个位置已经有了默认参数,那么从这个位置往后,从左到右都必须有默认值;
2、如果函数声明有默认参数,函数实现就不能有默认参数,声明和实现只能有一个默认参数;

函数占位参数:
C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置;
语法:返回值类型  函数名  (数据类型){ }

函数重载:
函数重载概述:
作用:函数名可以相同,提高复用性;
函数重载满足条件:
1、同一个作用域下;
2、函数名称相同;
3、函数参数类型不同  或者  个数不同  或者  顺序不同;
注意:函数的返回值不可以作为函数重载的条件;

函数重载注意事项:
#引用作为重载条件;
#函数重载碰到函数默认参数,出现二义性,报错,尽量避免这种情况;

类与对象:
C++面对对象的三大特性为:封装、继承、多态;
C++认为万事万物都皆为对象,对象上有其属性和行为;
例如:
人可以作为对象,属性有姓名、年龄、身高、体重…行为有走、跑、跳、吃饭、唱歌…
车也可以作为对象,属性有轮胎、方向盘、车灯…行为有载人、放音乐、放空调…
具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类;

封装:
封装的意义:
封装时C++面对对象三大特性之一
封装的意义:
#将属性和行为作为一个整体,表现生活中的事物;
#将属性和行为加以权限控制;
封装意义一:
       在设计类的时候,属性和行为写在一起,表现事物;
语法:class  类名{    访问权限:  属性    /  行为    };
总结:
#类中的属性和行为统一称为成员;
#属性也称为 成员属性 or 成员变量;
#行为也称为 成员函数 or 成员方法;

封装意义二:
类在设计时,可以把属性和行为放在不同的权限下,加以控制;
访问权限有三种:
1.public          公共权限(成员    类内可以访问    类外可以访问);
2.protected    保护权限(成员    类内可以访问    类外不可以访问);
3.private         私有权限(成员    类内可以访问    类外不可以访问);

struct 和 class区别:
在C++中 struct 和 class 唯一的区别就在于默认的访问权限不同;
区别:
#struct 默认权限为公有;
#class 默认权限为私有;

成员属性设置为私有:
优点1:将所有成员属性设置为私有,可以自己控制读写权限;
优点2:对于写权限,我们可以检测数据的有效性;


对象的初始化和清理:
#生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候也会删除一些自己信息数据保证安全;
#C++中的面向对象来源于生活,每个对象也都会有初始设置以及对象销毁前的清理数据的设置;

构造函数和析构函数:
#对象的初始化和清理也是两个非常重要的安全问题;
#一个对象或者变量没有初始状态,对其使用后果是未知;
#同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题;

C++利用了  构造函数  和  析构函数  解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作;
对象的初始化和清理工作是编译器强制要我们做的事情,因此如果我们不提供构造和析构,编译器会提供编译器提供的构造函数和析构函数是空实现。

#构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器主动调用,无须手动调用。
#析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值