出现的意义:解决各种函数、关键词和类的名称冲突问题。
定义方式:namespace + 命名空间的名字 + { }
(注意!}后面不加;)
namespace N1
{
//变量
int a=1;
int b=2;
//函数
int Add(int a, int b) {
return a + b;
}
//结构体类型
struct Node
{
struct Node* next;
int val;
};
//在N1命名空间中嵌套定义N2
namespace N2
{
int a=3;
}
}
命名空间内部可直接访问,外部需指定出他属于的命名空间。
法一 用访问限定符(::)直接访问
int main() {
printf("%d\n", N1::a);//1
printf("%d\n", N1::N2::a);//3
return 0;
}
法二 用using展开命名空间里某个单独的成员
using N1::b;
int main() {
//对比 :printf("%d\n", N1::a);//1
printf("%d\n", b);//2
return 0;
}
法三 using展开命名空间的全部成员
using namespace N1;
int main() {
printf("%d\n", a);//1
printf("%d\n", b);//2
return 0;
}
工程项目中:可能会产生命名冲突,所以把常用库里面一些对象或者类型展出来。
比如:using std::cin、using std::cout 等。
日常练习中:不在乎跟库命名冲突,所以可以把库的命名空间全部展开。
比如:using namespace std;
#include <iostream>
using namespace std;//日常练习
using namespace std::cin;//建议项目工程时这么定义
using namespace std::cout;
int main() {
int a;
cin >> a;//10
cout << a;//10
return 0;
}
缺省参数是在定义或声明函数时为函数的参数指定一个默认值。
调用该函数时,如果没有传对应的实参的值,则该参数就使用之前设定好的默认值(缺省值)。
// Func 函数有一个缺省参数
void Func(int a = 0)
{
cout<<a<<endl;
}
int main()
{
// 没有传参时,使用参数的缺省值
Func();
// 传参时,使用指定的实参
Func(10);
}
1、全缺省(形参全部给定缺省)
void Func(int a = 1,int b = 2,int c = 3) {
cout << a << endl;//1
cout << b << endl;//2
cout << c << endl;//3
}
2、半缺省参数(形参必须从右往左连续缺省,不可间隔缺省!)
void HalfFunc(int a, int b = 10, int c = 20) {
cout << a << endl;//66
cout << b << endl;//77
cout << c << endl;//20
}
int main() {
HalfFunc(66,77);
return 0;
}
c++允许实现功能类似,参数列表不同的同名函数。
这里的参数列表不同指的是参数的类型、顺序、个数不同
void f(int a)
{ }
void f()
{ }
int f(int a)
{ }
double f(double a)
{ }
void f(int a,char b)
{ }
void f(char b,int a)
{ }
// 返回值类型都为 int
int Add(int a, int b)
{}
// 返回值类型为double
double Add(int a, int b)
{}
void func(int a)
{}
void func(int a,int b=10)
{}
int main()
{
// error:不明确到底是调用带缺省的还是不带缺省的
func(10);
}
给已存在变量取别名,共用同一块内存空间,但编译器不会为该引用变量开辟内存空间。
(类似 林冲又叫豹子头,人民币又叫毛爷爷)
使用规则: 类型& 引用变量名 = 引用实体;
int main()
{
int a = 10;
int& ra = a;// ra 引用 a
//也可以给别名取别名
int& rra = ra;// rra 引用 ra
//a和ra和rra地址相同
printf("%p\n", &a);
printf("%p\n", &ra);
printf("%p\n", &rra);
return 0;
}
引用变量在定义时必须初始化,即必须有引用实体。
int& ra;//error
一个变量可以有多个引用。(人民币可以叫毛爷爷,也可以叫钞票)
一个引用对象只能引用一个实体。(毛爷爷只能是人民币的别名,不能是你爷爷)
首先,我们知道的是 int 访问权限(可读可写)大于 const int(仅可读)。
我们要知道一个概念,引用的访问权限只可缩小,不可放大。
int main()
{
// error:权限放大
const int a = 10;
int& ra = a;
//正常编译:允许权限缩小
int b = 10;
const int& rb1 = b;//权限缩小
int& rb2 = b;//权限相等
return 0;
}
v
//减少了c语言中指针对地址的解引用操作,可以直接修改实参的值
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
//函数返回值就是实参本身,减少了临时变量的创建,提高效率
//传引用返回
int& Count()
{
static int n = 0;
n++;
//返回n本身
return n;
}
//传值返回
int Count()
{
static int n = 0;
n++;
//返回n的值的一份临时拷贝对象
return n;
}
特别说明,引用返回容易造成的非法访问
*
符号),而指针需要。以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方把函数内容展开,从而替换对函数的调用,没有函数压栈的开销,内联函数可以提升程序运行的效率。
//定义两个数相加的内联函数
inline int Add(int a, int b)
{
return a + b;
}
NULL 预处理后:0 (可能被定义为字⾯常量0,使用需要类型转换) nullptr 预处理后:(void*)0 (隐式地转换为指针类型,避免类型转换问题)
故在c++,可以使用nullptr代替NULL传递空指针。