目录
前言:
C++是对C语言进行优化出来的一门语言,所以大多数C语言的知识还可以在C++上使用,甚至可以两者混合使用,毕竟主要是补充C语言的不足。
其中,C语言是面向过程的,C++是面向对象的。
一、C++的关键字:
C++是对C语言进行优化的一门语言,所以C++中的大多关键字和C语言一样,在这个基础上还多有些关键字:
这里就只对这些关键字进行展示,在后面的学习中会对新加的关键字进行学习。
二、命名空间的改进:
1、问题引入:
在C语言中,如下代码会出现重定义的错误:(这里的重定义是在全局变量的地方才会引入命名空间的概念)
cpp
#include<stdio.h>
#include<stdlib.h>
int rand = 0;
int main()
{
printf("%d\n", rand);
return 0;
}
这是因为在stdlib.h这个库函数中已经对rand进行了定义,所以就会出现重定义的错误。当然不止这些,如果你一开始写了很多行代码写的好好的,但是如果突然包含了别的头文件(在别的头文件中就有可能和你定义了一样名称的全局变量),就有可能会出现重定义的错误。
2、解决方案:
这个时候就可以用关键字namespace进行改进:
通过namespace定义一个命名空间域,随便取名(这里取名为ppr),这个时候namespace就像一堵墙隔开了,全局域和命名空间域,这个时候我要使用我定义的rand就可以用
ppr::rand来进行使用,::左边的是要找的域的地方,如果什么都没有就是在全局域中找rand
3、理解:
1.命名空间访问的先后顺序:
cpp
#include<stdio.h>
int a = 0;
namespace ppr
{
int a = 1;
}
int main()
{
int a = 2;
printf("%d\n", a);
printf("%d\n", ::a);
printf("%d\n", ppr::a);
return 0;
}
如上代码:如果没有用::的话,就在局部变量找a,如果::左边什么都没有就是在全局域中找a,如果指定了ppr那当然就是在ppr这个命名空间域中找。
注意:如果在局部变量中没有变量a,那么就在全局变量中找,如果全局变量中也没找到并不用会在命名空间域中找,除非通过(using namespace ppr)将命名空间域展开:
所以:a会现在局部域中找,再在全局域中找,最后展开命名空间域 or 指定访问命名空间域
cpp
#include<stdio.h>
namespace ppr
{
int a = 1;
}
using namespace ppr;
int main()
{
printf("%d\n", a);
return 0;
}
using namespace ppr可以理解为将命名空间域释放,所以int a就类似于在全局域中了,就会找到了。
2、命名空间可以嵌套:
cpp
#include<stdio.h>
#include<iostream>
using namespace std;
namespace ppr1
{
int a;
int b;
int Add(int left, int right)
{
return left + right;
}
namespace ppr2
{
int c;
int d;
int Sub(int left, int right)
{
return left - right;
}
}
}
int main()
{
cout << ppr1::Add(1, 2) << endl << ppr1::ppr2::Sub(2, 1) << endl;
return 0;
}
如上图所示:如果要在嵌套中使用就必须一层一层地访问。
3、命名空间名字相同会合并:
三、C++的输入和输出:
C++中的cout和cin是C++的内置对象(后面学习中在深入讲解)这个在std的命名空间中。
我们可以将其展开后使用。类似于C语言中的(printf和scanf)
cpp
#include<iostream>
using namespace std;
int main()
{
int a ;
cin >> a;
cout << "a = " << a << endl;
return 0;
}
四、缺省函数:
1、定义:
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
cpp
#include<iostream>
using std::cout;
using std::endl;
void ppr(int a = 10, int b = 20, int c = 30)
{
cout << a << endl;
cout << b << endl;
cout << c << endl << endl;
}
int main()
{
ppr();
ppr(1);
ppr(1, 2);
ppr(1, 2, 3);
return 0;
}
2、缺省参数分类
缺省函数分为全缺省函数 和半缺省函数
二者就是给的参数如果是全的话就为全缺省函数,如果不是全的话就是半缺省函数,如下:
cpp
void ppr1(int a = 10, int b = 20, int c = 30)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
void ppr2(int a, int b = 10, int c = 20)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
上述代码中:ppr1为全缺省函数,ppr2为半缺省函数。
注意:
- 半缺省参数必须 从右往左依次 来给出,不能间隔着给
- 缺省参数不能在函数声明和定义中同时出现
- 缺省值必须是常量或者全局变量
- C 语言不支持(编译器不支持)
五、函数重载:
函数重载的意思就是同一个函数名字但是因为传参的不同而导致所使用的函数不同,有三种不同参数的条件:
1、参数类型不同:
cpp
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、参数个数不同:
cpp
void ppr()
{
cout << "f()" << endl;
}
void ppr(int a)
{
cout << "f(int a)" << endl;
}
3、参数类型的顺序不同:
cpp
void ppr(int a, char b)
{
cout << "f(int a,char b)" << endl;
}
void ppr(char b, int a)
{
cout << "f(char b, int a)" << endl;
}
实例: