【C++初阶】C++入门(一)

2年前基础语言12594
【C++初阶】C++入门(一) 沐曦希 于2022-09-26 09:55:44发布 728 收藏 70 分类专栏: C++零基础学习 文章标签: c++ 开发语言 c语言 C++零基础学习 专栏收录该内容 4 篇文章 3 订阅 订阅专栏

大家好我是沐曦希💕

文章目录 1.前言2.C++关键字(C++98)3.命名空间namespace3.1 命名空间定义3.2 命名空间使用3.2.1 加命名空间名称及作用域限定符3.2.2 使用using将命名空间中某个成员引入3.2.3 使用using namespace 命名空间名称 引入 4.C++输入&输出4.1 命名空间完全展开4.2 命名空间的指定4.3 命名空间的部分展开 5.缺省参数5.1 缺省参数概念5.2 缺省参数分类5.2.1 全缺省参数5.2.2 半缺省参数 缺省参数应用场景 6.写在最后

1.前言

C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C++学习有一定的帮助,C++入门主要目标:

补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用域方面、IO方面、函数方面、指针方面、宏方面等。为后续类和对象学习打基础 2.C++关键字(C++98)

C++总计63个关键字,C语言32个关键字

asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenamethrowcaseenummutablestaticunionwchar_tcatchexplicitnamespacestatic_castunsigneddefaultcharexportnewstructusingfriendclassexternoperatorswitchvirtualregisterconstfalseprivatetemplatevoidtrueconst_castfloatprotectedthisvolatilewhiledeletegotoreinterpret_cast 3.命名空间namespace

在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”: 重定义;以前的定义是“函数”

#include<stdio.h> namespace test { int rand = 10; } int main() { printf("%d\n", rand);//函数的地址 return 0; }

而C++标准库的函数等放进std的命名空间里去。

3.1 命名空间定义

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

#include<stdio.h> // lj是命名空间的名字,一般开发中是用项目名字做命名空间名。 // 命名空间的名字可以按照直接喜好来拟定 // 1. 正常的命名空间定义. namespace lj { // 命名空间中可以定义变量/函数/类型 int rand = 10; int Add(int left, int right) { return left + right; } struct Node { struct Node* next; int val; }; } //2.命名空间可以嵌套 //test.cpp namespace N1 { int rand = 10; int Sub(int left, int right) { return left - right; } namespace N2 { int rand = 20; void Swap(int* left, int* right) { int tmp = *left; *left = *right; *right = tmp; } } } //3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。 // ps:一个工程中的test.h和上面test.cpp中两个N1会被合并成一个 //test.h namespace N1 { int a = 10; int b = 20; int Mul(int left, int right) { return left * right; } }

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

需要注意的是:只有同一级的相同名称的命名空间在编译运行时候,才会被合并。不同命名空间/域中可以定义同一个变量。同一个命名空间不能定义同一个变量。 放在命名空间的变量,不会影响该变量的生命周期,只是限定域,影响了编译器的查找规则(先找局部,后找全局),编译器在编译和运行时候不会查找在命名空间的定义的变量和函数,相当于增加了一堵墙。

namespace N1 { int rand = 10;//全局变量(放在静态区) } namespace N2 { int rand = 20;//全局变量 } 3.2 命名空间使用

那么命名空间如何使用呢?

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; }

命名空间的使用有三种方式:

3.2.1 加命名空间名称及作用域限定符 int main() { printf("%d\n", N::a); return 0; }

3.2.2 使用using将命名空间中某个成员引入 using bit::b; int main() { printf("%d\n", bit::a); printf("%d\n", b); return 0; }

3.2.3 使用using namespace 命名空间名称 引入 using namespace bit; int main() { printf("%d\n", a); printf("%d\n", b); return 0; }

4.C++输入&输出 4.1 命名空间完全展开 #include<iostream> // std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中 using namespace std; //将std命名空间的内容展开,用起来就方便,相当于把命名空间的隔离墙拆了 int main() { cout << "Hello world!!!" << endl; return 0; }

说明:

使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std。cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含头文件中。<<是流插入运算符,>>是流提取运算符。使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型。实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识,这些知识后续会学习,这里只是简单讲解他们的使用。

C++自动识别变量的类型本质是:函数重载

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

4.2 命名空间的指定 #include<iostream> int main() { std::cout << "hello world" << std::endl; return 0; }

::域作用的限定符

取到全局变量的值:

#include<stdio.h> int a = 10; int main() { int a = 100; printf("%d\n", a); printf("%d\n", ::a); return 0; }

4.3 命名空间的部分展开 #include<iostream> using std::cout; using std::endl; int main() { cout << "hello world" << endl; return 0; } #include <iostream> using namespace std; int main() { int a; double b; char c; // 可以自动识别变量的类型 cin >> a; cin >> b >> c; cout << a << endl; cout << b << " " << c << endl; return 0; } // ps:关于cout和cin还有很多更复杂的用法,比如控制浮点数输出精度,控制整形输出进制格式等等。因为C++兼容C语言的用法,这些又用得不是很多.

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

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

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

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

缺省需要注意的是:只能从右往左连续缺省。缺省必须是局部变量和全局变量,缺省参数不能在函数声明和定义中同时出现,只能在声明中即.h头文件中定义缺省参数。

5.2 缺省参数分类 5.2.1 全缺省参数 #include<iostream> using namespace std; void Func(int a = 10, int b = 20, int c = 30) { cout << "a =" << a << endl; cout << "b =" << b << endl; cout << "c =" << c << endl; cout << endl; } int main() { Func(); Func(1); Func(1, 2); Func(1, 2, 3); return 0; }

传值需要注意的是:不能跳过传值,例如:

Func(1, ,3);//错误的 5.2.2 半缺省参数 void Func(int a, int b = 10, int c = 20) { cout<<"a = "<<a<<endl; cout<<"b = "<<b<<endl; cout<<"c = "<<c<<endl; }

注意:

半缺省参数必须从右往左依次来给出,不能间隔着给。缺省参数不能在函数声明和定义中同时出现。 //a.h void Func(int a = 10); // a.cpp void Func(int a = 20) {} // 注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值。 缺省值必须是常量或者全局变量C语言不支持(编译器不支持) 缺省参数应用场景

在进行数据结构的链表等可以更加高效。

#include<stdio.h> #include<stdlib.h> #include<assert.h> namespace bit { typedef struct Stack { int* a; int top; int capacity; }ST; void StackInit(bit::ST* ps, int defaultcp = 4) { ps->a = (int*)malloc(sizeof(int) * defaultcp); assert(ps->a); ps->top = 0; ps->capacity = defaultcp; } } int main() { //不知道要插入多少个数据 bit::ST stl; bit::StackInit(&stl); //知道要插入100个数据 bit::ST st2; bit::StackInit(&st2, 100); } 6.写在最后

那么C++入门上就到这里结束了。

相关文章

AI画图 Disco-diffusion 本地搭建测试

AI画图 Disco-diffusion 本地搭建测试...

超详细陀螺仪MPU6050模块输出姿态角(有完整版源码)

超详细陀螺仪MPU6050模块输出姿态角(有完整版源码)...

HTML 实现仿 Windows 桌面主题特效

HTML 实现仿 Windows 桌面主题特效...

顺序表的基本操作(超详细)

顺序表的基本操作(超详细)...

wget 的安装与使用(Windows)

wget 的安装与使用(Windows)...

Rabbitmq死信队列

Rabbitmq死信队列...