c++学习笔记

基础部分

一、初识c++

  1. 程序的注释://单行注释
    /* 多行注释*/
  2. 变量
    变量的作用:给一段指定的内存空间起名,方便操作这段内存
    语法:数据类型 变量名=初始值;
  3. 常量
    作用: 用于记录程序中不可更改的数据
    c++定义常量的两种方式:
    1. #define 宏常量 :define 常量名 常量值 //通常在文件上方定义,表示一个常量
    2. const 修饰的变量: const 数据类型 常量名=常量值;//通常在变量定义前加关键字const,修饰该变量为常量,不可修改
  4. 关键字
    作用:关键字是c++中预先保留的单词(标识符)
    在定义变量或者常量时候,不要用关键字


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

二、数据类型

  1. 整形
    c++规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存
  2. sizeof关键字
    作用:利用sizeof关键字可以统计数据类型所占内存大小
    语法:sizeof(数据类型 / 变量)
  3. 浮点型
    作用:用于表示小数
    浮点型变量分为两种:
    1.单精度float
    2.双精度double
float f=3.14f;//后加f,否则默认为double类型
double d=3.14;
  1. 字符型
    作用:字符型变量用于显示单个字符
    语法:char ch='a';
    注意1: 在显示字符型变量时,用单引号将字符括起来,不要用双引号
    注意2:单引号内只能有一个字符,不可以是字符串
    c和c++中字符型变量只占用1个字节
    字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCLL编码放入到存储单元

  2. 转义字符
    作用:用于表示一些不能显示出来的ASCLL字符
    现阶段我们常用的转义字符有:\n \\ \t

  3. 字符串型
    作用:用于表示一串字符
    两种风格:
    c风格字符串: char 变量名[]="字符串值";
    char str1[]="hello world";
    c++风格字符串: string 变量名=“字符串值”

  4. 布尔类型
    作用:布尔数据类型代表真或假的值
    bool类型只有两个值:
    true----真
    false----假

三、运算符

作用:用于执行代码的运算

  1. 算数运算符
    作用:用于处理四则运算

  2. 赋值运算符
    作用:用于将表达式的值赋给变量

  3. 比较运算符
    作用:用于表达式的比较,并返回一个真值或假值

  4. 逻辑运算符
    作用:用于根据表达式的值返回真值或假值

四、程序流程结构

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

  1. 选择结构
    1) if语句
    1.单行格式 : if(条件){ 条件满足执行的语句};
    2.多行格式: if(条件){条件满足执行的语句} else{条件不满足执行的语句};
    3.多条件的if语句: if(条件1){条件1满足执行的语句} else if (条件2){条件2满足执行的语句}… else{都不满足执行的语句};
    4.嵌套if语句
    2)三目运算符
    作用:通过三目运算符实现简单的判断
    语法:表达式1?表达式2:表达式3

    3)switch语句
    作用:执行多条件分支语句

  2. 循环结构
    1)while循环语句
    作用:满足循环条件,执行循环语句
    语法:while (循环条件){循环语句} //break退出循环

    2)do…while 循环语句
    作用:满足循环条件,执行循环语句
    语法:do{循环语句}while(循环条件);
    注意:与while的区别在于do…while会先执行一次循环语句,在判断循环条件
    3)for 循环语句
    作用:满足循环条件,执行循环语句
    语法:for(起始表达式;条件表达式;末尾循环) {循环语句;}
    4)嵌套循环
    作用:在循环体中再嵌套一层循环,解决一些实际问题

  3. 跳转语句
    1)break
    作用:用于跳出选择结构或者循环结构

    2)continue语句
    作用:在循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环
    3)goto 语句
    作用:可以无条件跳转语句
    语法:goto 标记;
    解释:如果标记的名称存在,执行到goto语句时,会跳转到标记的位置

goto FLAG;
....
FLAG:
    .....

五、数组

  1. 概述
    所谓数组,就是一个集合,里面存放了相同类型的数据元素

  2. 一维数组
    1)

    2)一维数组数组名
    //数组名就是数组的首地址,列:arr[]={…};int *p=arr;

  3. 二维数组
    二维数组就是在一维数组上,多加一个维度
    1)

    2)二维数组名

六、函数

  1. 概述
    作用:将一段经常使用的代码封装起来,减少重复代码
    一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能。
  2. 函数的定义
    函数的定义一般主要有5个步骤:
    1).返回值类型
    2).函数名
    3).函数表列
    4).函数体语句
    5).return表达式

语法:

返回值类型 函数名 (参数列表)
{
    函数体语句
    return 表达式
}
  1. 函数的调用
    功能:使用定义好的函数
    语法:函数名(参数)
  2. 函数的常见样式
    常见样式有4种
    1)无参无返
    2)有参无返
    3)无参有返
    4)有参有返
  3. 函数的声明
    作用:告诉编译器函数名称及如何调用函数,函数的实际主体可以单独定义。
    ·函数的声明可以多次,但是函数的定义只能有一次
  4. 函数的分文件编写
    作用:让代码结构更加清晰
    函数分文件编写一般有4个步骤
    1)创建后缀名为.h的头文件
    2)创建后缀名为.cpp的源文件
    3)在头文件中写函数的声明
    4)在源文件中写函数的定义

七、指针

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

  2. 指针变量的定义和使用
    指针变量定义语法: 数据类型 * 变量名
    //指针前加* 代表解引用,找到指针指向的内存中的数据
    //可以通过解引用的方式来找到指针指向的内存

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

  4. 空指针和野指针
    1)空指针:指针变量指向内存中编号为0的空间
    用途:初始化指针变量
    注意:空指针指向的内存是不可以访问的
    2)野指针:指针变量指向非法的内存空间

    总结:空指针和野指针都不是我们申请的空间,因此不要访问

  5. const 修饰指针
    const修饰指针有三种情况:
    1)const修饰指针----常量指针
    const int *p=&a;
    //特点:指针的指向可以修改,但是指针指向的值不可以修改
    2)const修饰常量----指针常量
    int * const p =&a;
    //特点:指针的指向不可以改,指针指向的值可以改
    3)const既修饰指针,又修饰常量
    const int * const p =&a;
    //特点:指针的指向和指针指向的值都不可以改

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

  7. 指针和函数
    作用:利用指针作函数参数,可以修改实参的值

八、结构体

  1. 结构体基本概念
    结构体属于用户自定义的数据类型,允许用户存储不同的数据类型
  2. 结构体定义和使用
    语法:struct 结构体名 {结构体成员列表};
    通过结构体创建变量的方式有三种:
    1)struct 结构体名 变量名
    2)struct 结构体名 变量名={成员1值,成员2值…}
    3)定义结构体时顺便创建变量
  3. 结构体数组
    作用:将自定义的结构体放入到数组中方便维护
    语法:struct 结构体名 数组名{元素个数}={{},{}…{}}
  4. 结构体指针
    作用:通过指针访问结构体中的成员
    ·利用操作符->可以通过结构体指针访问结构体属性
  5. 结构体嵌套结构体
    作用:结构体中的成员可以是另一个结构体
  6. 结构体做函数参数
    作用:将结构体作为参数向函数中传递
    传递方式有两种:
    ·值传递
    `地址传递

c++核心编程

一、

  1. 内存分区模型
    代码区
    全局区
    栈区
    堆区
  2. new运算符
    语法:new 数据类型
    利用new创建的数据,会返回该数据类型的指针

二、引用

  1. 引用的基本使用
    作用:给变量起别名
    语法:数据类型 &别名=原名
  2. 引用注意事项
    ·引用必须初始化
    ·引用在初始化后,不可以改变
  3. 引用做函数参数
    作用:函数传参时,可以利用引用的技术让形参修饰实参
    优点:可以简化指针修改实参
  4. 引用做函数返回值
    作用:引用是可以作为函数的返回值存在的
    注意:不要返回局部变量引用
    用法:函数调用作为左值
  5. 引用的本质
    本质:引用的本质在c++内部实现是一个指针常量
  6. 常量引用
    作用:常量引用主要用来修饰形参,防止误操作
    在函数形参列表中,可以加const修饰形参,防止形参改变实参

三、函数提高

  1. 函数默认参数
    在c++中,函数的形参列表中的形参是可以有默认值的
    语法:
返回值类型 函数名 (参数=默认值){} 
//如果我们自己传入数据,就用自己的数据,如果没有,那么就用默认值   
//如果某个位置已经有了默认参数,那么从这个位置往后,从左    

到右都必须有默认值
2. 函数占位参数
c++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补改位置
语法:返回值类型 函数名 (数据类型){}

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

    (2).函数重载注意事项
    ·引用作为重载条件
    ·函数重载碰到函数默认参数

四、类和对象

c++面向对象的三大特性为:封装、继承、多态
c++认为万事万物都皆有对象,对象上有其属性和行为

  1. 封装
    语法:class 类名 { 访问权限: 属性/行为 };
访问权限:
public公共权限、   成员 类内可以访问  类外可以访问  
protected保护权限、成员 类内可以访问  类外不可以访问 儿子可以访问父亲中的保护内容   
private私有权限     成员 类内可以访问  类外不可以访问    儿子不可以访问父亲的私有内容  

(2)struct和class区别
在c++中struct和class唯一区别就是默认的访问权限不同
区别:
·struct默认权限为公共
·class默认权限为私有
(3)成员属性设置为私有
优点1:将所有成员属性设置为私有,可以自己控制读写权限
优点2:对于写权限,我们可以检测数据的有效性
2. 对象的初始化和清理
(1)构造函数和析构函数
构造函数语法:类名(){}
析构函数语法:~类名(){}
(2)构造函数的分类及调用
两种分类方式:
按参数分为:有参构造和无参构造
按类型分为:普通构造和拷贝构造
三种调用方式:
括号法
显示法
隐式转换法
(3)拷贝构造函数调用时机
(4)构造函数调用规则
默认情况下,c++编译器至少给一个类添加3个函数
·默认构造函数(无参,函数体为空)
·默认析构函数(无参,函数体为空)
·默认拷贝构造函数(函数,对属性进行值拷贝)

构造函数调用规则如下:
·如果用户自定义有参构造函数,c++不在提供默认无参构造,但是会提供默认拷贝构造
·如果用户自定义拷贝构造函数,c++不会再提供其他构造函数
(5)深拷贝与浅拷贝
浅拷贝:简单的赋值拷贝操作
深拷贝:在堆区重新申请空间,进行拷贝操作
(6)初始化列表
作用:c++提供了初始化列表语法,用来初始化属性
语法:构造函数():属性1(值1),属性2(值2)…{}
(7)类对象作为类成员

//当其他类对象作为本类成员,构造时候先构造其他类对象,再构造自身  
//析构顺序与构造顺序相反  

(8)静态成员
静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员
静态成员分为:
静态成员变量
·所有对象共享同一份数据
·在编译阶段分配内存
·类内声明,类外初始化
静态成员函数
·所有对象共享同一个函数
·静态成员函数只能访问静态成员变量

  1. c++对象模型和this指针
    (1)成员变量和成员函数分开存储
    在c++中,类内的成员变量和成员函数分开存储
    只有非静态成员变量才属于类的对象上
    (2)this指针概念
    c++通过提供特殊的对象指针,this指针,解决上述问题。
    //this指针 指向 被调用的成员函数 所属的 对象
    //this指针是隐含每一个非静态成员函数内的一种指针
    //this指针不需要定义,直接使用即可
    (3)空指针访问成员函数
    c++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针
    如果用到this指针,需要加以判断保证代码的健壮性
    (4)const修饰成员函数
    常函数:
    ·成员函数后加const后我们称这个函数为常函数
    ·常函数内不可以修改成员属性
    ·成员属性声明时加关键字mutable后,在常函数中依然可以修改

常对象:
声明对象前加const称该对象为常对象
·常对象只能调用常函数

  1. 友元
    友元的三种实现
    ·全局函数做友元
    ·类做友元
    ·成员函数做友元

  2. 运算符重载
    (1)加号运算符重载
    作用:实现两个自定义数据类型相加的运算
    (2)左移
    (3)递增
    (4)赋值
    (5)关系运算符
    (6)函数调用 (仿函数 )

  3. 继承
    继承是面向对象的三大特性之一
    继承的好处:可以减少重复的代码

class A: public B  
{ 
}

A类称为子类 或 派生类
B类称为父类 或 基类
派生类中的成员,包含两大部分
一类是从基类继承过来的,一类是自己增加的成员
从基类继承过来的表现其共性,而新增的成员体现了其个性
(2)继承方式
继承的语法: class 子类:继承方式 父类
继承方式一共有三种:
·公共继承
·保护继承
·私有继承

(3)继承中的对象模型
(4)继承中构造和析构顺序
子类继承父类后,当创建子类对象,也会调用父类的构造函数
继承中 先调用父类构造函数,再调用子类构造函数,析构顺序与构造函数相反
(5)继承同名成员处理方式
·访问子类同名成员,直接访问即可
·访问父类同名成员,需要加作用域
(6)继承同名静态成员处理方式
同上
·访问子类同名成员,直接访问即可
·访问父类同名成员,需要加作用域
(7)多继承语法
c++允许一个类继承多个类
语法:class 子类: 继承方式 父类1,继承方式 父类2…
多继承可能会引发父类中有同名成员出现,需要加作用域区分
7. 多态
多态的概念
多态是c++面向对象三大特性之一
多态分为两类
·静态多态:函数重载和运算符重载属于静态多态,复用函数名
·动态多态:派生类和虚函数实现运行时多态
静态多态和动态多态区别:
·静态多态的函数地址早绑定-编译阶段确定函数地址
·动态多态的函数地址晚绑定-运行阶段确定函数地址
多态满足条件
·有继承关系
·子类重写父类中的虚函数
多态使用条件
·父类指针或引用指向子类对象
重写:函数返回值类型 函数名 参数列表 完全一致称为重写
(2)多态的优点
代码组织结构清晰
可读性强
利于前期和后期的扩展以及维护
(3)纯虚函数和抽象类
在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容
因此可以将虚函数改为纯虚函数
纯虚函数语法:virtual 返回值类型 函数名 (参数列表)=0;
当类中有了纯虚函数,这个类也称为抽象类
抽象类特点:
·无法实例化对象
·子类必须重写抽象类中的纯虚函数,否则也属于抽象类

(4)虚析构和纯虚析构
解决方式:将父类中的析构函数改为虚析构或者纯虚析构
虚析构和纯虚析构共性:
·可以解决父类指针释放子类对象
·都需要有具体的函数实现
虚析构和纯虚析构区别:
·如果是纯虚析构,改类属于抽象类,无法实例化对象
虚析构语法:
virtual ~类名(){}

纯虚析构语法:
virtual ~类名 ()=0;
类名::~类名(){}

五、文件操作

程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放
通过文件可以将数据持久化
c++中对文件操作需要包含头文件<fstream>
文件类型分为两种:

  1. 文本文件 -文件以文本的ascll码形式存储在计算机中
  2. 二进制文件 -文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂他们
    操作文件的三大类:
    1.fstream:写操作
    2.ifstream:读操作
    3.fstream:读写操作


    读文件:

    (2)二进制文件
    以二进制方式对文件进行读写操作
    打开方式要指定为 ios::binary

c++提高编程

本阶段主要针对c++泛型编程和STL技术做详细讲解,探讨c++更深层的使用

一、模板

  1. 模板的概念
    模板就是建立通用的模具,大大提高复用性
    模板的特点:
    ·模板不可以直接使用,它只是一个框架
    ·模板的通用并不是万能的
  2. 函数模板
    ·c++另一种编程思想称为泛型编程,主要利用的技术就是模板
    ·c++提供两种模板机制:函数模板和类模板

(1)函数模板语法
函数模板作用:
建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表
语法:

template<typename T>
函数声明或定义

(3)
使用模板时必须确定出通用数据类型T,并且能够推导出一致的类型
3. 类模板
作用:建立一个通用类,类中的成员 数据类型可以不具体制定,用一个虚拟的类型来代表
语法:

template <typename T>
  1. 类模板与继承
  2. 类模板成员函数类外实现
  3. 类模板与友元

二、STL

  1. STL概念
    STL(standard template library,标准模板库)
    STL从广义上分为:容器 (container) 算法(algorithm) 迭代器(iterator)
    容器和算法之间通过迭代器进行无缝连接
    STL几乎所有的代码都采用了模板类或者模板函数

  2. STL常用容器
    (1)string容器
    本质:string是c++风格的字符串,而string本质上是一个类
    string和char区别:
    ·char
    是一个指针
    ·string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器
    特点:string类内部封装了很多成员方法
    (2)vector容器
    (3)deque容器
    (4)stack容器
    (5)queue容器
    (6)list容器
    (7)set容器
    (8)map容器

  3. STL函数对象

  4. STL常用算法

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值