c++ 整理

c++学习进度

lecture1 introduction

--12.20

lecture2 data type

1.char a= 0x1a == char a = '\x1a'

2.同样的16进制,0x45. char输出是E,int输出是69

--12.21

lecture3 operators

1.整型/整型会自动舍弃小数。

2.求模不能模浮点数。

3.注意,sizeof也是一个运算符,而不是函数。

--12.22

lecture4 if-else

1.一般在用if -else 时不建议省略{}

2.条件运算符:a?b:c; a正确则取前一个。

3.switch语句易错点,条件只能用int或者可以转换成int类型的数据类型。在每个分支后要加break,否则成立条件之后的语句都会输出。

4.system("pause"),可以使得调试暂停。

--12.23

lecture5 loop

1.do {} while(表达式); 容易遗漏;

2.for循环一般用于循环次数已知的情况,while一般用于“直到什么时候才停止”

--12.24

lecture6 function

1.关于函数声明,声明中形参的名字可以省略,原因是函数声明的目的是让编译器能够验证函数调用时提供的参数是否和形参表一致,而这只需要知道形参的个数、类型、和顺序即可。

​ eg: int Max(int x ,int y) == int Max(int,int )

2.关于函数返回值类型

​ 可以是任意基本数据类型 或 用户自定义struct、class类型。 另外c语言标准明确规定,数组类型和函数类型不可以做为返回值。

​ 解决的方法是可以返回其指针,但局部数组在函数被调用后会被销毁,所以返回局部数组指针也没有意义,不过也可以手动分配内存 (new()),这样不会被销毁。字符串是否可以存疑? c++里的sting 类。

3.当函数类型和return 表达式值不一致时,以函数类型为基准进行自动类型转换。

4.函数调用的运行过程:

​ a.对实参的每个表达式求值,然后将这些值复制到一个特定的内存空间里。以C++语言视角来看,类似于对形参变量进行赋值的操作

​ •因此当实参与形参类型不甚匹配时,发生自动类型转换

​ •对表达式求值的次序是不一定的:因此应避免诸如 Max(i, ++i)的写法

​ b.执行被调用函数的函数体,直到遇到return语句(在有返回值的函数中),或遇到表示函数体终结 的右大括号为止(在无返回值的函数中)

​ •每个函数的函数体也都存储在特定的内存空间中,所以这意味着程序执行指令的“指针”在内存中 发生了跳转

​ c.有返回值的函数计算出返回值后,将值复制到指定的CPU寄存器或内存空间中。随后,调用程序查 看此存储单元,读取返回值

​ •主调函数与被调函数遵照约定的返回值类型编码与解码此存储单元信息

5.按值传递参数

​ •发生函数调用时,程序将实参复制到一个特定的内存空间里,然后启动函数对应的指令序列。函数的指令序列启动后,将形参(标识符)与上述内存关联,然后执行后续语句。-》 这就意味着,在函数中对形参进行操作而修改的内存空间对外部的实参造不成影响。

6.默认值参数

​ 在写函数的时候,如果调用时没有赋值,则默认使用该参数值作为实参。

lecture7 scope 作用域与生存区

•函数体中定义的所有变量都是“局部”变量(Local variable),只在定义语句所在的函数体内有效

•函数形参也是局部变量,在函数体内有效

2.六种作用域

​ 1.块作用域(局部作用域)

​ •任何被大括号{}包围的语句都叫程序块

​ •函数体也是块

​ •If-else、while、for之后书写的{}也是块

​ •在程序块中声明的标识符有块作用域,作用域从声明语句开始,到所在块结束处为止

​ 2.函数作用域

​ 3.函数原型作用域

​ •函数原型声明时形参的作用范围:从形参定义开始,到函数原型右侧括号结束

​ 4.文件作用域

​ •定义在所有(函数与类的)大括号之外的变量叫“全局”(global)变量,其作用域为文件作用域, 作用范围从声明处开始,到所在文件结束处为止

​ 用头文件时,#include时将把其作用域扩展到当前的cpp文件中,直到文件结束为止

​ 缺点:

​ 1.始终占用内存空间,可能造成浪费

​ 2.降低程序的模块化程度及函数的通用性

​ 3.降低程序清晰性

​ 5.类作用域

​ 6.命名空间 namespace 作用域

3.自动变量:

​ 局部变量如果不用关键字static修饰声明,编译系统都默认为自动变量,动态地为其分配存储空间

4.静态变量:

•static关键字将变量的存储方式修改为“静态”,得到的静态变量(static variable)通常在变量定义时就分配存储单元并持续存在、直到程序结束

特性:

​ 1.生存期从程序第一次执行到定义该变量的语句开始,到整个程序结束为止

​ 2.但static不延伸作用域:还是只能在定义它的函数/语句块内使用,作用域之外的语句不能直接使用它

​ 3.静态局部变量的初始化只进行一次,以后每次调用函数时不再重复初始化

​ •这里可以看到初始化赋值语句是有差异的

​ •自动变量的初始化在每次调用时都会重复进行

​ 4.基本类型的静态局部变量如果声明时没有初始化其值,则系统自动赋值0x0

​ •自动变量是不会自动初始化的

5.内部函数:

​ 默认允许在其他文件(如main.cpp)中调用printHead.cpp文件中定义的函数

​ •如果在函数定义前加关键字static,则其变为内部函数,不能被其它文件调用(出现链接link错误)

益处:在多个不同cpp文件中可能出现同名函数的时候,可以防止链接时互相干扰出现链接错误

6.#include 区别

​ •#include

​ •到“系统目录”中去找文件

​ •#include "printHead.h“

​ •先在源文件所在目录找文件,如果找不到再去系统目录

7.预处理指令作用:

​ 1.定义常量:#define PI 3.1416

​ 2.定义在代码内展开的“函数”:#define Max(a, b) (a > b ? a : b)

​ 3.定义条件编译所依据的标记:#define FLAG

8.命名空间:

​ •集成大量不同来源的C++源代码时,不同的作者可能给相同的标识符(例如List、Table)定义了不 同的功能,放在不同的头文件里

​ • 需要一种缩小标识符作用域的机制

​ •用关键字namespace,将特定的块声明成“命名空间”,将标识符的作用域限制在块内

namespace my{ int Max(int a,int b){ } } using namespace suv; //或者 using suv::Max;

lecture8 recursion, function overload(递归,函数重载与模板)

1.递归是自己调用自己,必须有退出的条件。

​ 与循环相比,递归开销较大,但跟符合程序逻辑的自然表达。

2.重载,函数有多个不同定义。

​ •函数的形参个数、类型与顺序称为函数的 signature

​ •对函数调用,编译器根据实参个数、类型与顺序匹配相应的重载函数定义

​ 会有自动类转换,

3.函数模板:

​ •关键字template开头

​ •关键字typename Tid指定用Tid作为一个通用类型名(用class也可以:但建议用typename)

​ •然后就能把Tid当“int”用

template <typename Tid> Tid Max (Tid a,Tid b){ return a>= b? a:b ; }

​ 函数模板本身是不会/不能直接编译的。因此不能用“分离方式”定义函数模板

  1. 模板和重载的区别:

    ​ 模板

    •优势:自动复制完全相同的函数体

    •劣势:只适用于函数形参个数相同而类型不同、且函数体相同的情形

    ​ 重载

    •优势:支持差异较大的函数实现

    •劣势:函数体相同时需手动复制语句

    •更清晰的适用实例

    •但要注意更适合使用默认参数的情形

lecture9 arry 数组

1.数组的静态性:

​ •size必须是常量,确切地说是“编译阶段就能确定的数值”

​ 正整数

​ 也就是 int a =100; int b[a];这是错的。 要用const int。

​ --C99 添加了用变量做数组长度的语句,和支持0长数组的语句。但还没有通用。

2.计算数组大小:

​ sizeof(arryname)/sizeof(typename)

3.默认不赋初值,int a[5];

int a[5]={1}; 第一个是1,其余为0.

4.错误:

​ 不能对整个数组赋值:int a[5];

a = {0,1,2,3,4} --这是错误的。

5.数组表示夫其实是一个地址,

​ int a[4]; (a+1)[1]; 这是正确用法

6.二维数组是数组的数组。

​ 二维数组做参数是,要包含两个信息。

​ 该参数是数组类型+成员是多大的数组。

sum(table[][size_c])

不用传递行数。

lecture10 string

1.c++类型,string类,有索引越界检查。

使用: #include

2.会自动加上\0。

3.字符对应ascii 常量。

4.不同的输入方式:

​ cin>>stingvar 跳过开始的空白符号,(空格/\t/\n)。然后将空白符之前的字符输入。

​ 所有有空白符时不能输入整行。

​ 用getline(cin,sringvar)。会 获取下一个\n及其之前的字符(包括\n)。

​ ch = cin.get() 获取一个字符(空白符也可以)。

  1. 操作

    stingvar.size()求长度

    +,连接变量


__EOF__

本文作者userName
本文链接https://www.cnblogs.com/Blunt-Raz0r/p/14170466.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Blunt-Razor  阅读(87)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示