计算机语言 之【C++】入门级知识讲解(命名空间,C++输入输出,缺省参数,函数重载,引用,内敛函数,auto关键字,for循环,指针空值nullptr)

本文主要是介绍计算机语言 之【C++】入门级知识讲解(命名空间,C++输入输出,缺省参数,函数重载,引用,内敛函数,auto关键字,for循环,指针空值nullptr),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

三点睡六点起,阎王夸我好身体

不到三点我不睡,太平间里抢C位

一、命名空间

1.命名空间的作用

2.命名空间定义

3.命名空间使用

二、C++的输入输出

1.输入输出说明介绍

2.std命名空间的使用惯例

三、缺省参数

1.缺省参数概念

2.缺省参数分类

四、函数重载

1.函数重载概念

五、引用

1.引用概念

2.引用特性

3.常引用

4.使用场景

5.传值、传引用、传指针效率比较

6.引用和指针的区别

六、内联函数

1.概念

2.特性

七、auto关键字(C++11)

1.概念

2.auto的使用规则

3.auto不能推导的场景

八、基于范围的fou循环

1.范围for的语法

2.范围for的使用条件

九、指针空值——nullptr

1.C++98中的指针空值

2.nullptr的概念及使用

十、完结撒❀

前言:

本片博客是以学习过C语言之后进入C++学习为前提,讲解C++入门级知识,为C++之后的学习做铺垫

–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–

一、命名空间

1.命名空间的作用

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染namespace关键字的出现就是针对这种问题的。

在编译器运行时查找标识符遵循局部有先原则:从主函数开始从下往上,先查找局部域,再查找全局域(头文件也包含在全部域当中)

举例:

比如下面一段代码:

#include <stdio.h>
#include <stdlib.h>
int rand = 10;
// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决
int main()
{printf("%d\n", rand);
return 0;
}
// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”

众所周知头文件stdlib.h中包含有一个rand函数,而我们又在全局变量中定义一个rand变量,这就会引起命名冲突,而如果在C语言中我们不可能对stdlib.h中的rand函数进行重命名,所以我们只有对所起的变量名字进行重命名。

因为在以后工作中我们对一些函数或者变量得命名是要有一定意义的,不可以随便命名,所以有时候即使发生了命名冲突我们也不想重命名。

而在C++中我们可以使用命名空间来解决这个问题,使得两者都不必重新命名就可以进行区分

2.命名空间定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后**接一对{}**即可,{}中即为命名空间的成员。

比如:

#include <stdio.h>
#include <stdlib.h>namespace zdy//我的网名简写而已,一般开发中是用项目名字做命名空间名。
{rand = 10;
}int main()
{printf("%d\n",rand);return 0;
}

注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中

这样上面程序主函数中rand编译器最后编译就会认为是头文件stdlib.h中得rand函数,所以打印出来的值会很大。

命名空间中变量/函数/类型都是可以定义的,这里就不过多为大家进行举例。

3.命名空间使用

命名空间中成员该如何使用呢?
拿上面例子来说我们要怎样使用命名空间zdy中的rand变量呢?

这里我们来介绍一下 ::作用域限定符

#include <stdio.h>
#include <stdlib.h>//头文件stdlib中也有rand是一个函数namespace zdy
{int rand = 10;
}int main()
{printf("%d\n",zdy::rand);return 0;
}

可以看到在printf里面rand之前用了一个::作用域限定符,其作用就是限定所指向的作用域

上面代码中zdy::rand表示限定在zdy作用域中指向rand变量。

当::作用域限定符前面为空时,默认还是代表全局域

这里我们再来介绍一个关键字 using

using的作用是可以将命名空间或是命名空间中的成员引入到全局域中

比如:

#include <stdio.h>
#include <stdlib.h>
using zdy::rand;//1
//using namespace zdy;//2namespace zdy
{int rand = 10;
}int main()
{printf("%d\n", rand);return 0;    
}

上面代码中using1代表只展开了zdy命名空间中的rand变量

using2代表把命名空间zdy进行了展开,里面所有的成员都会引入到全局域当中(虽然这里我们只有rand一个变量😅)

这时就又会出现命名冲突的问题

所以我们以下面代码为例:


namespace bit
{// 命名空间中可以定义变量/函数/类型int a = 0;int b = 1;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}int main()
{// 编译报错:error C2065: “a”: 未声明的标识符printf("%d\n", a);
return 0;
}

那么根据上面代码使用命名空间中的a变量的方式有三种:

1) 加命名空间名称及作用域限定符

int main()
{printf("%d\n", N::a);return 0;    
}

2) 使用using将命名空间中某个成员引入

using N::b;
int main()
{printf("%d\n", N::a);printf("%d\n", b);return 0;    
}

3) 使用using namespace 命名空间名称 引入

using namespce N;
int main()
{printf("%d\n", N::a);printf("%d\n", b);Add(10, 20);return 0;    
}

当然第3种方法这里对命名空间中的Add函数直接使用也是可以的。

二、C++的输入输出

1.输入输出说明介绍

输出:

#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
using namespace std;int main()
{cout<<"Hello world!!!"<<endl;return 0;
}

输入:

#include <iostream>
using namespace std;int main()
{int i = 0;cin >> i;cout << i<<endl;return 0;
}

说明:

1) 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std。

2) cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中

3) <<是流插入运算符,>>是流提取运算符。

4) 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型。

5) 实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识,这些知识我们我们后续才会学习,所以我们这里只是简单学习他们的使用。

所以cout,cin,endl等都是包含在头文件iostream中的std命名空间当中,所以我们在使用它们的时候需要先将std命名空间全部进行展开 using namespace std,或者在工作中我们为了避免全部展开发生不利影响,通常是使用那个就将那个引用到全局变量中使用,比如:using std::cout。

注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;旧编译器(vc 6.0)中还支持<iostream.h>格式,后续编译器已不支持,因此推荐使用+std的方式。

关于cout和cin还有很多更复杂的用法,比如控制浮点数输出精度,控制整形输出进制格式等等。因为C++兼容C语言的用法,这些又用得不是很多,我们这里就不展开学习了。后续如果有需要我会再出博客进行讲解。

2.std命名空间的使用惯例

std是C++标准库的命名空间,如何展开std使用更合理呢?

1) 在日常练习中,建议直接using namespace std即可,这样就很方便。

2) using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 + using std::cout展开常用的库对象/类型等方式。

三、缺省参数

1.缺省参数概念

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

void Func(int a = 0)
{cout<<a<<endl;
}
int main()
{Func();     // 没有传参时,使用参数的默认值Func(10);   // 传参时,使用指定的实参return 0;
}

2.缺省参数分类

1) 全缺省参数

void Func(int a = 10, int b = 20, int c = 30){cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;}

2) 半缺省参数

void Func(int a, int b = 10, int c = 20){cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;}

注意:

1. 半缺省参数必须从右往左依次来给出,不能间隔着给

2. 缺省参数不能在函数声明和定义中同时出现

//a.hvoid Func(int a = 10);// a.cppvoid Func(int a = 20){}// 注意:如果声明与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值。

3. 缺省值必须是常量或者全局变量

4. C语言不支持(编译器不支持)

四、函数重载

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。
比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不不了!”

1.函数重载概念

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

见下代码:

#include<iostream>
using namespace std;// 1、参数类型不同
int Add(int left, int right)
{cout << "int Add(int left, int right)" << endl;return left + right;
}double Add(double left, double right)
{cout << "double Add(double left, double right)" << endl;return left + right;
}// 2、参数个数不同
void f()
{cout << "f()" << endl;
}void f(int a)
{cout << "f(int a)" << endl;
}// 3、参数类型顺序不同
void f(int a, char b)
{cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{cout << "f(char b, int a)" << endl;
}int main()
{Add(10, 20);Add(10.1, 20.2);f();f(10);f(10, 'a');f('a', 10);return 0;
}

五、引用

1.引用概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间

比如:李逵,在家称为"铁牛",江湖上人称"黑旋风",但都指同一个人。

类型& 引用变量名(对象名) = 引用实体

void TestRef()
{int a = 10;int& ra = a;//<====定义引用类型printf("%p\n", &a);printf("%p\n", &ra);
}

调用上面函数运行可以看到打印出来的地址是一样的。

注意:引用类型必须和引用实体是同种类型的

2.引用特性

1) 引用在定义时必须初始化

2) 一个变量可以有多个引用

3) 引用一旦引用一个实体,再不能引用其他实体

void TestRef()
{int a = 10;int b = 20;// int& ra;   // 该条语句编译时会出错int& ra = a;int& rra = a;//int& rra = b;   //运行报错printf("%p %p %p\n", &a, &ra, &rra);  
}

3.常引用

我们通过下面几个报错例子进行学习

1)

    const int a = 10;//int& ra = a;   // 该语句编译时会出错,a为常量const int& ra = a;

这里ra不能引用变量a,因为变量a用const修饰,权限只能读,而使用int& ra引用,ra权限是可读可写,权限被放大,不可以。

2)

    // int& b = 10; // 该语句编译时会出错,b为常量const int& b = 10;

这个原理和1)一样,10为常量,只可读,而被b引用后权限被放大,所以要用const进行修饰。

3)

    double d = 12.34;//int& rd = d; // 该语句编译时会出错,类型不同const int& rd = d;

引用变量类型不同不可以进行引用,但是加上const表示引用变量名不可以被改变(只读),那么会发生隐式类型转换存储到rd中。

4.使用场景

1)做参数

void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}

2)做返回值

int& Count()
{static int n = 0;n++;// ...return n;
}

大家思考一下下面代码输出结果是什么,为什么

int& Add(int a, int b)
{int c = a + b;return c;
}
int main()
{int& ret = Add(1, 2);Add(3, 4);cout << "Add(1, 2) is :"<< ret <<endl;return 0;
}

讲解看下图:
在这里插入图片描述注意:如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。

5.传值、传引用、传指针效率比较

以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。

所以传值和指针与传引用在作为传参以及返回值类型上效率相差是很大的。

6.引用和指针的区别

语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。

底层实现上实际是有空间的,因为引用是按照指针方式来实现的

举例
比如下面代码:

int main()
{int a = 10;int& ra = a;ra = 20;int* pa = &a;*pa = 20;return 0;
}

我们来看下引用和指针的汇编代码对比:

在这里插入图片描述
可以看到引用和指针在汇编代码上是一摸一样的。

引用和指针的不同点:

1)引用概念上定义一个变量的别名,指针存储一个变量地址。

2)引用在定义时必须初始化,指针没有要求

3)引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体

4)没有NULL引用,但有NULL指针

5)在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)

6)引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小

7)有多级指针,但是没有多级引用

8)访问实体方式不同,指针需要显式解引用,引用编译器自己处理

9)引用比指针使用起来相对更安全

六、内联函数

1.概念

inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开没有函数调用建立栈帧的开销内联函数提升程序运行的效率

下图是没有使用内联函数,汇编代码中的call表示调用了Add函数,没有对Add函数进行展开
在这里插入图片描述
如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。

查看方式:

1)在release模式下,查看编译器生成的汇编代码中是否存在call Add

2)在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不会对代码进行优化以便更好地调试,以下给出vs2022的设置方式)

右键点击文件后点击属性

在这里插入图片描述在这里插入图片描述
被inline修饰后的函数汇编代码中将不会出现call指令,调用函数将直接进行展开

在这里插入图片描述

2.特性

1)inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。

2)inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。
下图为《C++prime》第五版关于inline的建议:

在这里插入图片描述3)inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。

七、auto关键字(C++11)

1.概念

auto是用来修饰变量的

auto作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得

也就是说使用auto来声明变量不用表示其变量类型,变量的类型由编译器推到而得,任何变量类型都可以用用auto进行声明。

大家可以运行下面代码进行验证

int TestAuto()
{return 10;
}int main()
{int a = 10;auto b = a;auto c = 'a';auto d = TestAuto();cout << typeid(b).name() << endl;cout << typeid(c).name() << endl;cout << typeid(d).name() << endl;//auto e; 无法通过编译,使用auto定义变量时必须对其进行初始化return 0;
}

typeid().name可以返回变量类型

注意:

使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。

2.auto的使用规则

1)auto与指针和引用结合起来使用

用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&

2)在同一行定义多个变量

当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

void TestAuto()
{auto a = 1, b = 2; auto c = 3, d = 4.0;  // 该行代码会编译失败,因为c和d的初始化表达式类型不同
}

3.auto不能推导的场景

1)auto不能作为函数的参数

2)auto不能直接用来声明数组

3)为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法

4)auto在实际中最常见的优势用法就是跟以后会讲到的C++11提供的新式for循环,还有lambda表达式等进行配合使用。

八、基于范围的fou循环(C++11)

1.范围for的语法

在C++98中如果要遍历一个数组,可以按照以下方式进行:

void TestFor()
{int array[] = { 1, 2, 3, 4, 5 };for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)array[i] *= 2;for (int* p = array; p < array + sizeof(array)/ sizeof(array[0]); ++p)cout << *p << endl;
}

对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围

void TestFor()
{int array[] = { 1, 2, 3, 4, 5 };for(auto& e : array)e *= 2;for(auto e : array)cout << e << " ";return 0;
}

上面代码中第一个for循环将array数组中的所有元素按照循环以此赋给e,之后再将e乘2。
第二个for循环就是将array中的每个值按照循环以此赋给e并进行打印。

注意:与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环。

2.范围for的使用条件

1)for循环迭代的范围必须是确定的

对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。

注意:以下代码就有问题,因为for的范围不确定

void TestFor(int array[])
{for(auto& e : array)cout<< e <<endl;
}

2)迭代的对象要实现++和==的操作。(关于迭代器,以后再进行讲解,现在提一下,没办法讲清楚,现在大家了解一下就可以了)

九、指针空值——nullptr

1.C++98中的指针空值

在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下方式对其进行初始化:

void TestPtr()
{int* p1 = NULL;int* p2 = 0;// ……
}

NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:
在这里插入图片描述
可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void)的常量*。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如:

void f(int)
{cout<<"f(int)"<<endl;
}void f(int*)
{cout<<"f(int*)"<<endl;
}int main()
{f(0);f(NULL);f((int*)NULL);return 0;
}

程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此程序运行对于f函数的调用会出现匹配错误。

在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0。

2.nullptr的概念及使用

所以为了解决以上问题,在C++11中就引入了nullptr来代替null:

1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。

2. 在C++11中,sizeof(nullptr) 与 sizeof((void)0)所占的字节数相同。*

3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

void f(int)
{cout<<"f(int)"<<endl;
}void f(int*)
{cout<<"f(int*)"<<endl;
}int main()
{f(0);f(NULL);f((int*)NULL);f(nullptr);return 0;
}

运行上面程序就不会出现函数匹配错误。

十、完结撒❀

如果以上内容对你有帮助不妨点赞支持一下,以后还会分享更多编程知识,我们一起进步。
最后我想讲的是,据说点赞的都能找到漂亮女朋友❤
在这里插入图片描述

这篇关于计算机语言 之【C++】入门级知识讲解(命名空间,C++输入输出,缺省参数,函数重载,引用,内敛函数,auto关键字,for循环,指针空值nullptr)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/880380

相关文章

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

变量与命名

引言         在前两个课时中,我们已经了解了 Python 程序的基本结构,学习了如何正确地使用缩进来组织代码,并且知道了注释的重要性。现在我们将进一步深入到 Python 编程的核心——变量与命名。变量是我们存储数据的主要方式,而合理的命名则有助于提高代码的可读性和可维护性。 变量的概念与使用         在 Python 中,变量是一种用来存储数据值的标识符。创建变量很简单,

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象