月度归档:2018年01月

[Cpp基础] [03] 变量声明-定义及初始化

Last Updated on 2022年9月27日

变量的"声明,定义"以及"初始化"

想要彻底理解这一部分的内容,你应该对OS/进程/虚拟内存/编译/链接过程有一定的了解,仅从语言层次学习是比较抽象的.

声明和定义

  • 从编译的角度看:
    • 仅声明某个变量,那么就只创建了Symbol,这个Symbol对应的存储空间需要在后续的链接过程中resolve.
    • 定义某个变量,在创建Symbol的同时,编译器为其分配了存储空间, 这个存储空间可以被链接器reslove道引用这个Symbol的地方.
  • 对开发者而言:
    • 如果你希望使用某个已经存在的对象,那么就应该使用声明语句.
    • 每个定义语句都有"声明"的效果,不存在只定义不声明的语句.
  • 就C++而言,若语句仅有extern,且不含任何初始化部分,则该语句就是一个纯粹的声明,例如
    • extern T &val;//纯声明
Read More

[Cpp基础] [02] 拷贝/移动与引用

Last Updated on 2022年9月27日

这一部分主要介绍左值,右值,引用,拷贝和移动.这些可以说是C++11显著区别于以前的C++(还有C)的特性.本文主要从易用的角度介绍值类型(值类型实际要更多一些).

拷贝与移动的基本定义

  • "拷贝"和"移动"是从逻辑层面定义的,在最终的指令层面,只有"拷贝",没有"移动"操作.
  • 对于自定义类,拷贝与移动的实现有基本的准则(非硬性),这些准则是:
    • 拷贝:不应对源对象做任何修改.
    • 移动:可以对源对象做修改,但是源对象被修改后必须可以被赋值,且可以安全的析构.
  • 注意,对于移动操作.我们不能对移出后剩余的部分做任何假定,在没有重新赋值前,不应该使用移出后剩下的对象
    • 例如:对一个vector<int> a;,其中的所有元素都被auto b = std::move(a);移出后,不能假定
Read More