命名空间(namespace)
在往常C中常常会遇到 命名冲突 的问题基于此设计 命名空间以清晰分装变量/函数/类型(如结构体 类 联合体等)
namespace shad
{
class Data
{
int _year;
public:
void Init()
{
int _month = 1;
int _day = 28;
}
};
struct coordinates
{
int x;
int y;
};
}
命名空间的展开:
全部展开
using namespace shad;
部分展开(适用于多次使用的变量单独展开)
using namespace shad::Data.Init();
域作用限定符::
若只有::加在变量名字前表示全局变量
若shad::Data.Init();
对于结构体则特殊:struct shad::coordinates.x = 999;
※额外说明域有:全局域、类域、局部域、命名空间域。
缺省参数
在函数声明时对参数就进行定义就形成了缺省参数。
缺省顺序只能从右向左 不能跳跃缺省。
int Add(int x, int y = 66)
{
return x + y;
}
int main()
{
cout << Add(3) << endl;
return 0;
}
全缺省
指所有形参均在声明时定义
半缺省
部分形参在声明时定义
缺省调用:
凡未缺省参数必须提供值
函数重载(chong zai)
同名函数 但有部分区别
1.参数类型不同
2.参数个数不同
3.参数顺序不同
4.参数const是否修饰
如例:
int fuc(int a,int b);
int fuc(double a,double b);
全局函数重载与成员函数重载
| 1. 类内((类内)友元声明+类外定义) | 可以访问 private | 全访问 | 最常用 |
| 2. 类外(普通全局) | 完全独立,需要公有接口 | 只能访问 public | 简单类 |
| 3. 类内(友元且类内定义) | 隐式内联,方便 | 全访问 | 小型函数 |
class Point {
private:
int x, y;
public:
Point(int x = 0, int y = 0) : x(x), y(y) {}
// 1. 在类内声明友元(告诉编译器这个全局函数是我的朋友)
friend Point operator+(const Point& p1, const Point& p2);
};
// 2. 在类外(同一个文件)定义全局函数
Point operator+(const Point& p1, const Point& p2)
{
return Point(p1.x + p2.x, p1.y + p2.y);
}
不可构成的情况:
1.仅返回值不同 double Add(); int Add();
2.静态非静态
3.仅变量名不同
4.typedef定义别名 int Add(INT x,INT y);
引用
引用又称"取别名"。指为同一个变量/常量取别名,用此别名就可以访问。即对别名的++对应变量自然会++。

其可以替代指针作为形参大大简便了输入

此外引用常常也作为返回值
野引用/悬空引用
一、函数野引用
例:
int& Func()
{
int a = 9;
int& ra = a;
return ra;
}
其中ra在Func内定义出函数自动销毁无法返回
二、free会怎么样呢?
了解了上一个例子试分析以下代码——ra是否也变成了野引用呢?
int* a = (int*)malloc(sizeof(int) * 10);
if (a == nullptr)
{
perror("a_malloc fail");
return -1;
}
//(int*)&ra = a; //err
int*&ra = a;
free(a);
a = nullptr;
答案:ra因a的释放其变为野引用 又因a = nullptr导致其成为空指针的引用。
引用和指针的区别:
| 性质 | 引用 | 指针 |
| 内存空间 | 不用分配 | 需要分配 |
| 安全性 稳定性 | 更安全 更稳定 | |
| 适用场景 | 函数参数 返回 | 移动 指向 |
| 初始化 | 使用必须初始化 | 不必初始化 一般初始化 |
| 更改 | 创建后不可更改引用 | 创建后可更改指向 |
| 销毁 | 不存在销毁之说 出生命周期自动销毁 | free或出域(栈空间分配) |
| 访问 | 引用可以直接访问对象 | 需要解引用才能访问 |
引用的底层是指针
反汇编如下
int a = 10;
00007FF7470D1ACE mov dword ptr [a],0Ah
int& b = a; //!!!!!!!!!!!!!!!!!!!!!!!!!
00007FF7470D1AD5 lea rax,[a] //引用位于寄存器(一般位于栈中 具体位置还要看编译器)。
//!!!!!!!!!!!!!!!!!!!!!!!!!
00007FF7470D1AD9 mov qword ptr [b],rax
引用与const
首先const限制只读不写 因此出现了权限问题 引用情况下权限只可以平移、缩小但不可以放大:
(1)缩小
int a = 10;
const int& ra = a; //权限缩小为只读
临时对象引用
即:由计算/转换得来的数据引用
如果: int& r = (10+20); // 错误原因:临时对象具有常性 这行代码导致权限放大
应为:const int& r = (10+20);
※空引用不存在但存在对空指针的引用
内联函数
短函数 多次频繁调用的函数 会在调用位置展开不再建立栈帧
理解:代码展开而非反汇编展开
内联函数特殊在于.h文件中直接定义 原因是:
inline被展开就没有了函数地址 导致链接错误
inline Swap(int& x,int& y) //没错又是Swap
{
int tmp = x;
x = y;
y = tmp;
}
※内联函数对编译器而言只是一个优化建议当函数内代码稍微过多就会失去特性正常建立栈帧
nullptr
进入C++后使用的NULL
由于源代码下NULL在C++中被#define NULL 0 或
#define NULL (*(void*))0
如果兄弟们觉得有价值的话不妨点个赞让更多人看到哦~





