先解释域的概念,域分为局部域和全局域,类似于函数体的{ }内、关键字的{ }内(例如if)的区域即是局部域,函数体外的区域则是全局域。
变量有生命周期的概念,而一个变量的生命周期在变量离开所定义的域后结束,例如一个函数内的临时变量再出了函数执行结束后会被销毁释放。
而在使用一个变量时,操作系统默认从所在的局部域先找该变量的定义,若找到则直接使用,若是没找到则去全局域内找,而域作用限定符的作用则是改变系统寻找变量定义的默认顺序,先到指定的域去寻找变量的定义。
例如:下图的变量a,默认在局部域内找,而使用域作用限定符( : : 前不加指定域则默认为全局域)后,则优先在全局域内找,因此打印的结果不同
命名空间域是在c的基础上,为了解决变量名或者函数名重定义的问题,在一个项目中,可能有多个人共同进行编写,而最终整合后,一些结构体变量的定义命名或者函数命名等等,可能会重复导致报错,因此有了命名空间域的诞生。
命名空间域是一个自定义的局部域,可以将自己所写的代码都放到自己定义的命名空间域中,在使用时可以利用域作用限定符(::)去指定自定义的域名让操作系统找到你的代码,从而避免与其他人命名冲突的问题
namespace 自定义名称
{
......
}
例如:
namespace chk
{
void print()
{
printf("haha\n");
}
//...
}
要使用命名空间内的函数或者定义,则需要对命名空间进行展开,有三种方式:
1.全部展开,即直接将命名空间内的内容在全局域内全部展开,此时命名空间的作用也就失效了
2.部分展开,对部分要经常使用的函数进行展开,则可以避免每次使用时都需要用域作用限定符去找
3.指定命名空间访问,用域作用限定符去找到指定的命名空间进行访问使用
...//具体命名空间内容参考上面的例子图
//全局展开
using namespace chk;
//部分展开
using chk::print;
//三个操作只需要有一个,都可使用print函数
int main()
{
//指定命名空间展开
chk::print();
return 0;
}
目前暂时只需要会用即可,c中的printf可以用cout代替,scanf用cin代替
cin与cout能够自动识别类型进行输入与输出
int main()
{
float b = 0.0;
//scanf("%f",&b);
cin >> b;
printf("%.1f\n",b);
cout << b << endl;
//endl相当于“\n”
system("pause");
return 0;
}
在写函数时,设计函数参数时,可以从右到左的给定预备值(默认值),这些值在函数被使用时,如果函数没有传具体的参数,则使用这些预备值作为函数的参数,这些参数就被称为缺省参数,意为可以省略或者缺少的参数。
例子:
缺省参数的使用,也可以是部分缺省,上图是全缺省,而部分缺省即是只对一部分给定默认值,且遵循从右到左的顺序给定, 而在使用函数对其传参时,同样严重遵循从右到左的缺省,而不能中间缺省,后面又传
缺省函数使用时要注意的:
1.从右往左用
2.不能在声明和定义同时出现,一般在声明部分给
3.缺省参数必须是常量或者全局变量
在C++中,可以允许出现同名的函数,但前提是其参数要有所区别,可以是类型上、数量上、不同类型不同顺序上,C++语法会自动通过参数去对函数名进行不同的修饰,从而找到对应的函数使用
一般用于类似于有着相近或者相同的功能,但参数不同的情况下
#include
using namespace std;
void sawp(int* a,int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void sawp(double* a,double* b)
{
double tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{
int a = 1,b=2;
double c = 1.1,d=2.2;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
cout << "d = " << d << endl;
swap(a,b);
swap(c,d);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
cout << "d = " << d << endl;
system("pause");
return 0;
}
场景一:对变量进行别名
场景二:需要对传参的值进行改变时,可以用引用代替指针
场景三:引用返回(为后续做铺垫)
在函数返回时,如果返回值在函数结束后不销毁,则可以使用引用返回,在函数类型后面加&,相当于将变量直接返回到上一级函数中,如果该变量已销毁,则返回的仍是该变量所占空间,不过此时为非法访问,因此一定要注意返回变量是否有销毁
int& Count()
{
static int n = 0;
n++;
// ...
return n;
}
用于替代宏函数,在函数前加一个inline,在一些较小的函数时,编译器会选择不建立栈帧,从而实现效率上的优化,这是一种空间换时间的做法,这里的空间是指文件内存空间
inline int add(int x,int y)
{
return x+y;
}
注意:内联一般使用时,函数声明和定义不能分开
在定义变量赋值时可以自动去识别类型,通常可用于简化代码
补充小知识:可以用 typeid(变量名).name() 得到该变量的类型
本质上可以理解为,自动将数组内的数值依次赋予给变量x,并且自动判断结束
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9};
for(int i = 0 ;i
补充知识:NULL 和 nullptr 的区别
在c++中,NULL有时会被当做整形0处理,因此需要使用nullptr,在一定场景下不容易出错
注意:
1.一行声明多个变量是允许的,但变量类型要保持一致
2.auto不能作为形参,不能声明数组
以上是从c到c++的部分语法上的改变,为了接下来的类和对象一章做铺垫