引用
-
拷贝构造函数的参数
必须是当前类的引用
(通常是 const 引用)
否则会导致无限递归调用-
如果拷贝构造函数的参数
是 “值传递”(而非引用) -
那么在调用拷贝构造函数时,
需要先将实参(一个对象)复制给形参(函数参数)
而复制对象又会触发拷贝构造函数的调用 -
形成无限循环:
调用拷贝构造函数
→需要复制参数
→再调用拷贝构造函数
→……
-
-
非const引用 绑定到右值(编译错误)
void func(int& x) {} int main() { func(10); return 0; }// 方案1:const引用 可绑定右值 void func(const int& x) {} func(10); // 方案2:左值可绑定到 非const引用 int a = 10; func(a); -
引用绑定到 “即将销毁的临时对象”(运行时未定义行为)
const int& getRef() { int x = 10; return x; } int main() { const int& ref = getRef(); cout << ref << endl; return 0; }// 解决方案:返回值(复制x的值) int getValue() { int x = 10; return x; } -
引用捕获局部变量后,lambda 生命周期超过变量生命周期(悬垂引用)
function<int()> get_func() { int x = 10; return [&x]() { return x; }; } int main() { auto func = get_func(); func(); // 未定义行为(访问已销毁的内存) } // 解决方案:使用值捕获[x] -
函数返回引用
-
赋值运算符重载,用于连续赋值
-
容器的元素访问函数
-
返回类的成员变量的引用
-
返回全局 / 静态变量的引用
-
部分迭代器的解引用操作(如 operator*)返回引用
-
-
在构造函数体内初始化引用(错误)
class MyClass { int& ref; // 引用成员 public: MyClass(int x) { ref = x; } };// 解决方案:初始化列表中绑定引用 class MyClass { int& ref; public: MyClass(int& x) : ref(x) {} };
拷贝
- 禁用拷贝
class NonCopyable { NonCopyable(const NonCopyable&) = delete; NonCopyable& operator=(const NonCopyable&) = delete; };
堆(内存)
- 分配1个int,值初始化为10
int* p1 = new int(10); delete p1; - 分配包含5个int的数组
int* p2 = new int[5]; delete[] p2;// 数组元素全部初始化为0(零初始化) int* p3 = new int[5](); int* p4 = new int[5]{1,2,3}; // 前3个元素初始化为1,2,3,剩余元素为0
全局变量,静态全局变量,静态局部变量
-
全局变量
在一个源文件中定义(分配存储空间)
在其他源文件中用 extern 进行声明 -
静态全局变量
-
在所有 函数外部,用 static 修饰的变量
-
作用域仅限于定义它的那个 源文件内部
其他文件无法感知或访问它 -
避免命名冲突,实现 文件私有 的全局状态
-
-
静态局部变量
-
在 函数内部,用 static 修饰的局部变量
-
函数调用结束后
静态局部变量的 内存一直存在
下次进入函数时
它 保持 上次退出时的值 -
只在定义它的函数内部可见
-
只在程序第一次执行到其定义语句时初始化一次
后续调用会跳过初始化
-

浙公网安备 33010602011771号