前言
此系列博客记录我学习c++的过程。
一、命名空间
1.
在学习c语言的过程中我们会遇到命名冲突的问题
下面的代码由于头文件里已经有了rand变量,我们再定义就会出错,但是这种情况并不多见,我们可以避免
#include<stdlib.h>
int rand = 1;
但是如果在公司中,你自己写的名字和同事写的一样,就比较难办,这时候必须有人退让改名字
这时候就需要使用命名空间来解决这个问题
2.
namespace northshaddock
{
int rand = 1;
}
这个时候就不会有冲突了,即使名字一样
那么如何去找到我们定义在命名空间里的变量呢
一般来说,我们不指定的情况下,编译器会在全局找,这个时候我们就要使用域作用限定符,告诉它到指定的命名空间里去找
//全局去找
printf("%p\n", rand);
// 域作用限定符::
printf("%p\n", northshaddock::rand);
3.
命名空间里可以定义变量、函数、类型
namespace northshaddock
{
// 命名空间中可以定义变量/函数/类型
int rand = 10;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
int val;
};
}
然后是使用
printf("%d\n", northshaddock::rand);
printf("%d\n", northshaddock::Add(1, 2));
printf("%d\n", Add(1, 2));
struct bit::Node node;
值得注意的是结构体,域作用限定符在结构体名Node的前面,而不是struct前面
4.展开命名空间
// 全部展开(授权)
using namespace northshaddock;
// 部分展开(授权)
using northshaddock::Add;
展开命名空间,就是放开命名空间的权限,可以去这里面找
默认情况下我们在全局里找,展开后可以进去找
但是这样会危险,假如全局和命名空间里都有,就不知道找哪一个,所以尽量不要全部展开
5.
命名空间可以嵌套
namespace bit
{
namespace xxx
{
int rand = 1;
}
}
printf("%d\n", northshaddock::xxx::rand);
6.
这一行就是展开c++标准库
//这一行是干什么的?为什么要有这一行
//std是C++标准库的命名空间
using namespace std;
7.
同时要与头文件的展开区分开
头文件的展开是将头文件中的代码拷贝一份过来
命名空间的展开是开放权限
8.
命名空间会自动合并
一个项目里有好几个.h文件,每个里面都可以定义namespace northshaddock,不会冲突
二、流插入(cin)和流提取(cout)
1.基本使用
// << 流插入运算符
cout << "hello world" << endl;
// 流提取
int i = 0;
cin >> i;
2.
这两个运算符都会自动识别类型,其原理是函数重载,后面会讲
cin >> i >> j;
cout << i << endl;
cout << j << endl;
3.
值得一提的是,因为cin控制精度比较麻烦,且c++兼容c语言,所以控制精度仍使用printf
printf("%.1f\n", j);
三、缺省参数
1.
缺省参数就是一个函数在定义的时候先给一个值,在调用函数时如果传参就用传的参数,不传就用这个缺省参数
// 缺省参数
void Func(int a = 1)
{
cout << a << endl;
}
Func(2);
Func();
2.全缺省
全缺省就是每个变量都给一个缺省值
//全缺省
void Func(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
优点是非常灵活
传一个就是传给第一个
3.
半缺省
给缺省值时必须从右往左给,右边的有缺省值,左边的才能给
// 半缺省 -- 必须从右往左,给缺省值
void Func(int a, int b = 10, int c = 20)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
4.
如果函数声明和定义分离,那么声明和定义不能同时给缺省值,声明给定义不给
四、函数重载
1.
函数重载就是有多个函数,但是名字是同一个
如下面的Add函数,在int和double类型的相加中都能用,同时,我们在使用时函数会根据我们传的参数,自动匹配对应的函数
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;
}
C语言不允许同名函数
CPP可以,但是要求构成函数重载
函数名相同,参数不同,参数不同指参数的类型、个数和顺序不同
注意,返回值不同不构成函数重载
2.
要注意一点,参数的顺序不同是指类型顺序不同,而不是参数名字改变位置
如第一个参数类型是int,第二个参数类型是double,那么第一个参数类型
是double,第二个参数是int,这样构成重载
//这样构成函数重载
void func(int a, double b)
{
}
void func(double a, int b)
{
}
//这样是不构成函数重载的
void func(double a, int b)
{
}
void func(double b, int a)
{
}
3.
这样是不构成函数重载,必须在同一个域里
4.
这样构成重载,但是会有调用歧义
总结
这篇文章介绍了c++的一些基础语法知识,是c语言到c++的过渡知识