这篇文章我们来学习吹泡泡,有一次性几点学习内容:
目录
在学习c++前我们为什么要学习c语言,因为c++就是由几个大佬对c语言进行升级改进得来的,c++的根就是c,c++包容c的语法不过也有许多独创的语法,在c语言的基础上容纳了面对对象编程思想。并增加了许多有用的库,以及编程范式等。
本章主要目的:
1、补充c语言语法的不足
2、为后续类的学习打下基础
c++有63个关键字,c语言有32个关键字

在c/c++中,变量和后面学到的类都是大量存在的,这些函数、变量和类的名称都大量存在用途全局作用域中,可能会导致很多冲突,就是同一个名字被使用多次。使用命名空间的目的是对标识符名称进行初始化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
总而言之,命名空间就是为了避免命名冲突。
命名冲突:

stdlib.h里面有一个rand函数,你编写的这个程序编译器就分不清你想要的是rand=10这个变量还是rand函数的返回值。
所以c++提出了namespace来解决这个问题。
定义命名空间,需要使用到namespace关键字,后面跟美国这命名空间的名字,然后接一对{}即可,{}中间即为命名空间成员。
使用方法:
- namespace bit
- {
- int rand=10;
- int ADD(int left,int right)
- {
- return left+right;
- }
- struct Node
- {
- struct Node*next;
- int val;
- };
- }
- int main()
- {
- int a = 10, b = 10;
- printf("%d", bit::ADD(a,b));//域作用限定符
- return 0;
- }
(1)加命名空间以及作用域限定符:
- int main()
- {
- priuntf("%d",N::a);
- return 0;
- }
(2)使用using建某个命名空间某个变量引入:
- using N::b;
- int mian()
- {
- printf("%d",b);
- return 0;
- }
(3)使用using namespace 命名空间:
- using namespace N;
- int main()
- {
- printf("%d",b);
- return 0;
- }
我们用到的using namespace std的语法依据就是源自于此,为了避免coder定义的变量和函数与库函数冲突,改良c的大佬就把所有库函数封装在命名空间std里面,然后我们每次使用using namespace std ;就相当于回到了没有把他们封装起来的状态,容易命名冲突的问题又暴露出来了,只不过我们平时做函数练习不太会命名冲突才这样。
(1) 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
比如在一个.h文件里有一个命名空间:
- namespace N
- {
- int a;
- }
然后在另外一个.h文件里有一个同名的命名空间:
- namespace n
- {
- int b;
- }
然后编译器会整合成一个
- namespace N
- {
- int a;
- int b;
- }
(2)在同一个层次上的域是不能重定义的,但是可以在另一个层次的域是可以出现重定义的
不允许:
- namespace n
- {
- int a;
- }
-
- namespace m
- {
- char a;
- }
但是允许:
- namespace n
- {
- int a;
- namespace m
- {
- char a;
- }
- }
- //使用的时候:
- n::m::a='c';
c++的hello world:
- #include
- using namespace std;
- int main()
- {
- cout<<"Hello world!"<
- return 0;
- }
说明:
1.使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含头文件以及按命名空间使用方法使用std。
2.cout和cin是全局的流对象,endl是特殊c++符号,表示换行输出,他们都包含在头文件中。
3.<<是流插入运算符,>>流提取运算符。
4.使用c++输入更加方便因为他不需要用到像printf/scanf输入输出那样,需要手动控制格式,c++的输入输出是可以自动识别类型的。
注意:早期标准库将所有功能在全局域中实现,声明在
.h
后缀的头文件中,使用时只需包含对应
头文件即可,后来将其实现在
std
命名空间下,为了和
C
头文件区分,也为了正确使用命名空间,
规定
C++
头文件不带
.h
;旧编译器
(vc 6.0)
中还支持
格式,后续编译器已不支持,因
此
推荐
使用
+std
的方式。
- #include
- using namespace std;
- int main()
- {
- int a=1;
- char b=98;
- double c=1.1;
- cout<" "<" " <
- return 0;
- }

虽然c++的输入输出非常轻松,但我们并不是只能用c++的输入输出就比如说,我们只想输出小数点后两位,这时候我们用c++的语法就没有怎么容易的虽然可以但是会麻烦一些,遇到这种情况建议c++语法夹杂着c的语法.
- #include
- using namespace std;
- int main()
- {
- int a=1;
- char b=98;
- double c=1.11111;
- cout<" "<" ";
- printf("%0.2f\n",c);
- return 0;
- }
四、缺省参数
4.1缺省参数概念
缺省参数是声明或定义函数时为函数指定的一个缺省值。在调用该函数时,如果没有指定实参则采用该形式的缺省值,否则使用指定的实参。
- void Func(int a = 0) {
- int main()
- {
- Func(); // 没有传参时,使用参数的默认值
- Func(10); // 传参时,使用指定的实参
- return 0;
- }
4.2缺省参数分类
(1)全缺省参数
- void Func(int a = 10, int b = 20, int c = 30)
- {
- cout<<"b = "<
- cout<<"c = "<
- }
(2)半缺省参数
- void Func(int a,int b=10,int c=20)
- {
- cout <<"b= "<
- cout <<"c= "<
- }
注意:
1.半缺省参数必须从右往左依次来给出,不能间隔着给。
- int main()
- {
- Func(10,,30);
- }
2.缺省参数不能在函数声明和定义中同时出现,因为要是声明的缺省,和定义的缺省不一致,那我们调用的时候要用哪种?我们一般在函数声明的时候进行缺省时定义,在函数定义的时候不进行缺省。
void Func(int a=10,int b,int c=20);
- void Func(int a,int b,int c=20)
- {
- cout <<"b= "<
- cout <<"c= "<
- }
3.缺省值必须是常亮或者全局变量。
4.c语言不支持。(编译器不支持)
五、函数重载
自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重
载了。
比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个
是男足。前者是
“
谁也赢不了!
”
,后者是
“
谁也赢不了!
5.1函数重载概念
是函数的一种特殊情况,c++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数、或类型或类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。
5.2函数重载的几个类别
- #include
- 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;
- }
注意第三点,是参数顺序类型不同,而不是强调顺序不同(int a,int b)变成(int b,int a)就不行。
5.2 c++支持函数重载的原理——名字修饰
为什么c不支持函数重载但是c++支持呢?
简单的说就是:程序在编译链接时需要找到函数的地址去进行调用的,而我们在C语言找到函数的地址是通过函数的名字,比如你定义一个函数void fun(int a);就是通过fun这个名字找到的。
但要是在c++语法中是需要在查找前对名字进行重修饰的,以void fun(int a,double b)为例,就会通过funid这个和名字去查找地址,fun为函数原名,i和d是他的形参数据类型int和double。这样编译器调用时就不会找到 fun(int a)那里去了。
-
相关阅读:
Tomcat web.xml文件中的mime-mapping
day61 layui和分页原理
保姆式教程:MAC安装Android studio(包括安装JDK,Android SDK),解决gradle下载慢的问题
两大图灵奖得主力作:计算机架构的新黄金时代
项目资源管理的流程、技术和工具
痞子衡嵌入式:聊聊i.MXRT1170双核下不同GPIO组的访问以及中断设计
修复VS2015没有代码提示的问题【已解决】
外汇天眼;VT Markets 赞助玛莎拉蒂MSG Racing电动方程式世界锦标赛
Go map 竟然也会发生内存泄漏?
一种改进多旋翼无人机动态仿真的模块化仿真环境研究(Matlab代码实现)
-
原文地址:https://blog.csdn.net/qq_64484137/article/details/126896761