C++第四天 2016-12-03 2.4-2.6

  • 顶层const

    顶层const 表示指针本身是一个常量,底层const表示指针所指的对象是一个常量

    拷贝过程中,顶层const没有影响,底层const要求双方都是底层const或者两个对象的数据类型必须能够转换。

    首先我们说说顶层const和底层const的通俗定义

    顶层const: 表示指针本身是个常量,更简单的说顶层const作用对对象本身,表示对象是一个常量

    底层const: 表示指针所指向的对象是个常量

    所以有以下结论(个人总结)

    将const考虑成向右结合

    • 如果const右结合修饰的为 类型 或者 * ,那这个const就是一个 底层const
    • 如果const右结合修饰的为 标识符 ,那这个const就是一个 顶层const

     

    来自 <http://www.tuicool.com/articles/qqYJnaY>

     

     

    constexpr和常量表达式

    常量表达式(const expression)是指不会改变并且在编译过程就能得到计算结果的表达式。

    const int const int 1; int staff max files = limit = max size = 27; 20; files max files limit staff size

    因为 staff_size可以改变所以不是常量表达式

    重要 constexpr变量

    c++11新标准规定允许将变量声明为constexpr类型,来让编译器去验证是否是一个常量表达式。

    重要 字面值类型 literal type,算术类型、引用和指针都属于字面值类型,自定义类、IO库、string类不属于,不能被定义为constexpr。如果指针和引用定义为constexpr,则指针的初始值必须是nullptr或者0或者是储存于某个固定地址中的对象。

    处理类型

    类型别名 type alias。使用typedef定义类型别名

    typedef double wages wagesdouble的同义词

    typedef wages base, *p //basedouble同义词,pdouble* 同义词(typedef wages * p

    重要 c++11标准中规定了新的方法 别名声明(alias declaration

    using SI = Sales_item; using作为别名声明的开始,后面紧跟别名和等号,作用是把等号左侧的名字规定成等号右侧的类型别名。

    typedef char *pstring;

    const pstring cstr=0;

    const char *cstr =0;

    对于上面,前声明了一个指向char的常量指针,后声明了一个指向const char的指针。

    auto类型说明符

    c++11新标准可以使用auto让编译器去分析表达式所属的类型。但是一条auto只能声明一个基本类型

    auto auto - 3.14; sz pi

    重要 auto会忽略顶层const留下底层const,想要保留需要const auto声明

    decltype类型指示符

    c++11新标准引入了第二种类型说明符decltype,选择并返回操作数的数据类型。

    decltype(f()) sum =x;sum的类型就是f的返回类型。

    const int ci decltype (ci) x decltype (cj ) decltype (cj ) z; — ci; x; x const int const int & , y

     

    / / decltype 的 结 果 可 以 是 引 用 类 型 i n t = decltype (r + 0 ) b; decltype (*p) c; / / 正 确 : 加 法 的 结 果 是 int , 因 此 b 是 一 个 ( 未 初 始 化 的 ) int / / 错 误 : c 是 int& , 必 须 初 始 化

    如果变量多了一层括号,编译器就会把它当成一个表达式

    / / decltype 的 表 达 式 如 果 是 加 上 了 括 号 的 变 量 , 结 果 将 是 引 用 decltype( 0 ) ) d; decltype ( 主 ) e; / / 错 误 : d 是 土 n 乜 & , 必 须 初 始 化 / / 正 确 : e 是 一 个 ( 未 初 始 化 的 ) int

    双括号中,永远是引用,单括号只有生命本身是引用才会是引用。

    自定义类

    重要 使用struct进行类名和类体定义。类定义末尾需要加上分号

    c++11中,可以对类成员提供类内初始值(in-class initializer

    class也可以定义类型。

    重要 预处理器 preprocessor

    #开头 头文件保护 header guard

    #define 指令把一个名字设定为预处理变量

    #ifdef 当且仅当已定义为真时

    #ifndef 当且仅当变量未定义时为真,一旦检查结果为真,则执行后续操作到#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值