前言
📚作者简介:爱编程的小马,是一名大厂后端c++程序员。
📚本文收录于c++系列,本专栏主要是分享我所了解的c++知识,带领大家慢慢从了解c++到认识c++,持续更新!
📚本文主要内容:带大家先认识一下c++,其中包含命名空间,输入输出,标准库,以及缺省参数
目录
1.认识c++
1.1 命名空间
给大家讲解命名空间之前,先引入一个C语言的例子
#include<stdio.h> #include<stdlib.h> int rand = 10; int main() { printf("%d\n", rand); return 0; }
这段代码,报错了,报了一个rand重定义,因为rand在头文件是函数,预处理就会将头文件展开,导致和整型变量重复了。下面来看看c++是如何处理的:
在c/c++中,变量、函数、结构体(类)都是大量存在的,那么这些名称就会存在很多冲突,你用了这个名称,其他人就必须要改变自己的名称,那么在c++里有引入命名空间,其作用是用来对标识符的名称进行本地化,以避免命名冲突。namespace关键字就是在这个基础上产生的。
注意: 命名空间中可以定义变量,可以定义函数,可以定义结构体
1.1.1 命名空间的定义
namespace boke { int m = 20; int Add(int x, int y) { return x + y; } struct student { int age; char name[20]; long number; }; }
1.1.2 命名空间的访问
那么命名空间中的成员如何访问呢?有三种方法
●加命名空间名称及作用域限定符(::)
#include<iostream> using namespace std; namespace boke { int m = 20; int Add(int x, int y) { return x + y; } struct student { int age; char name[20]; long number; }; } int main() { cout << boke::m << endl; return 0; }
●局部展开命名空间,使用using关键字
#include<iostream> using namespace std; namespace boke { int m = 20; int Add(int x, int y) { return x + y; } struct student { int age; char name[20]; long number; }; } using boke::m; int main() { cout << m << endl; return 0; }
●全局展开命名空间,using namespace+命名空间名称
#include<iostream> #include<string.h> using namespace std; namespace boke { int m = 20; int Add(int x, int y) { return x + y; } struct student { int age; char name[20]; long number; }; } using namespace boke; int main() { int a = 5; int b = 6; cout << m << endl; cout << Add(a, b) << endl; student s1; s1.age = 10; strcpy(s1.name, "lisi"); s1.number = 194056789; cout << s1.age << endl; cout << s1.name << endl; cout << s1.number << endl; return 0; }
注意: 全局展开命名空间很危险,可能还是会导致命名冲突,建议还是加作用域限定符进行访问
2.1 c++的输入和输出
2.1.1 输入
在c++中,使用输入输出时必须包含头文件iostream,以及命名空间std。
cin(标准输入对象)是c++中全局的流对象,是istream的对象,">>"是流提取运算符
c++中不用手动控制格式,编译器会自动识别。
#include<iostream> using namespace std; int main() { int m = 0; double d = 0; cin >> m >> d; cout << m << endl; cout << d << endl; return 0; }
例如输入100 ,99.9 键盘上用空格隔开两个数即可
2.2.2 输出
在c++中,使用输入输出时必须包含头文件iostream,以及命名空间std。
cout(标准输入对象)是c++中全局的流对象,是ostream的对象,"<<"是流插入运算符
c++中不用手动控制格式,编译器会自动识别。
2.2.3 c++的标准库
推荐大家使用以下方法来包含标准库的头文件
#include<iostream> using namespace std;
3.1 缺省参数
3.1.1 缺省参数的概念
缺省参数是定义或声明函数时,为函数的参数设置的一个缺省值。在调用函数时,如果没有设定该参数,则使用缺省参数,否则使用设定的参数。
#include<iostream> using namespace std; void fun1(int a = 10) { a++; cout << a << endl; } int main() { fun1(); return 0; }
这个会输出什么结果?上面降到了,如果没有给值,那就使用缺省值,会输出11;
如果给了一个值,就会用这个值而不会使用缺省值。
3.1.2 缺省参数的分类
●全缺省参数
#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(15); func(15,16); func(15, 16, 17); return 0; }
全缺省可以传一个,传两个,传三个,也可以不传。
●半缺省参数
注意:半缺省不是指缺省一半,而是一部分是缺省参数,一部分是函数参数
#include<iostream> using namespace std; void func(int a , int b , int c = 30) { cout << "a=" << a << endl; cout << "b=" << b << endl; cout << "c=" << c << endl; cout << endl; } int main() { func(1,2); func(1,2,3); return 0; }
注意:1、半缺省必须从右到左连续给出,不能间隔给
2、缺省参数不能同时在定义和声明中给出
3、缺省值必须是常量或者是全局变量
4、C语言不支持缺省参数
3.1.3 缺省参数的应用
随便举一个例子,用顺序表给出一个例子,比如说,我们在学习数据结构的时候,总会说,一开始开不开空间,开多大的空间?下面来看缺省参数的好处
#include<iostream> using namespace std; struct SeqList { int* a; int size; int capacity; void SeqListInit(SeqList* s , int capacity = 4) { int* tmp = (int*)malloc(sizeof(int) * capacity); if (tmp == nullptr) { perror("malloc failed"); return; } s->a = tmp; s->capacity = capacity; s->size = 0; } void checkcapacity(SeqList* s) { if (s->size == s->capacity) { cout << "扩容" << s->capacity << endl; int* tmp = (int*)realloc(s->a, sizeof(int) * capacity * 2); if (tmp == nullptr) { perror("malloc failed"); return; } s->a = tmp; s->capacity *= 2; } } void SeqListInsert(SeqList* s, int x) { checkcapacity(s); s->a[s->size++] = x; } }; int main() { SeqList s1; s1.SeqListInit(&s1,101); for (int i = 0; i <= 100; i++) { s1.SeqListInsert(&s1, i); } for (int i = 0; i <= 100; i++) { cout<<s1.a[i]<<" "; } return 0; }
这个情况就很好用,就是呢我知道要开多大空间,存储多少内存,那我就定义capacity,如果我不知道,那就默认开4个空间,十分好用。
总结
本文从c++的认识切入,带大家了解了命名空间,输入输出,标准库,以及缺省参数;明天给大家更新函数重载,引用等主要知识,今天只是为c++开个小头。
如果这份博客对大家有帮助,希望各位给小马一个大大的点赞鼓励一下,如果喜欢,请收藏一下,谢谢大家!!!
制作不易,如果大家有什么疑问或给小马的意见,欢迎评论区留言