这篇文章我们来学习吹泡泡,有一次性几点学习内容:
目录
零、本节知识安排目的
一、c++关键字
二、命名空间
2.1命名空间的定义
2.2命名空间的使用
2.2注意事项
三、c++输入与输出
四、缺省参数
4.1缺省参数概念
4.2缺省参数分类
五、函数重载
5.1函数重载概念
5.2函数重载的几个类别
5.2 c++支持函数重载的原理——名字修饰
在学习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!"<
说明:
1.使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含
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<
虽然c++的输入输出非常轻松,但我们并不是只能用c++的输入输出就比如说,我们只想输出小数点后两位,这时候我们用c++的语法就没有怎么容易的虽然可以但是会麻烦一些,遇到这种情况建议c++语法夹杂着c的语法.
#include
using namespace std;
int main()
{
int a=1;
char b=98;
double c=1.11111;
cout<
缺省参数是声明或定义函数时为函数指定的一个缺省值。在调用该函数时,如果没有指定实参则采用该形式的缺省值,否则使用指定的实参。
void Func(int a = 0) {
cout<
(1)全缺省参数
void Func(int a = 10, int b = 20, int c = 30)
{
cout<<"a = "<
(2)半缺省参数
void Func(int a,int b=10,int c=20)
{
cout <<"a= "<
注意:
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 <<"a= "<
3.缺省值必须是常亮或者全局变量。
4.c语言不支持。(编译器不支持)
自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是 “ 谁也赢不了! ” ,后者是 “ 谁也赢不了!
是函数的一种特殊情况,c++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数、或类型或类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。
#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)就不行。
为什么c不支持函数重载但是c++支持呢?
简单的说就是:程序在编译链接时需要找到函数的地址去进行调用的,而我们在C语言找到函数的地址是通过函数的名字,比如你定义一个函数void fun(int a);就是通过fun这个名字找到的。
但要是在c++语法中是需要在查找前对名字进行重修饰的,以void fun(int a,double b)为例,就会通过funid这个和名字去查找地址,fun为函数原名,i和d是他的形参数据类型int和double。这样编译器调用时就不会找到 fun(int a)那里去了。