C++primer学习笔记(第二章)

  • 列表初始化的时候{ },C++编译器会严格的检查类型转换,不符合要求会报错;=初始化则不会出现这一状况。
  • 变量的声明与定义。声明是在别的c++文件中定义了(c++的分离式编译),在当前文件中使用;如果想声明而非定义一个变量,就在变量名前添加extern关键字,而且不要显式地初始化变量。声明:extern int i; 定义:int i; extern int i =10;
  • 变量只能定义一次,但是可以被多次声明。
  • 定义在函数体外的标识符不能以下划线开头
  • 内作用域可以使用外作用域已经存在的名字,优先使用内,加::全局作用符使用外
  • 引用只能绑定在一个对象上,不能换位置,引用不是一个对象,
  • 指针是一个对象,指针无须在定义时赋初值,不能定义引用的指针
  • 大多数情况,指针和所指定的对象的类型要严格匹配,有两个例外,第一允许令一个指向常量的指针指向一个非常量对象
  • 解引用*仅适用于那些确实指向了某些对象的指针
  • NULL是预处理变量
  • int zero =0; pi = zero;这是错的,不能把int变量直接赋值给指针,即使int变量的值正好是0
  • 建议初始化所有指针
  • 赋值永远改变的是等号左边的对象
  • 空指针的值是0,也是fasle,任何非零的指针的条件值是true
  • void*仅仅是一段内存空间的地址,并不能操作对象
  • 变量的定义包括一个基本数据类型和一组声明符
  • 引用不是对象,所以不能定义指向引用的指针
  • 指针的引用 int p = nlltptr ;int &r=p; r是指针p的引用。要理解r的类型是什么,最简单的方法就是从右往左阅读r的定义
  • const对象必须初始化
  • 默认状态下,const对象仅在文件内有效,多个文件共享同一个const变量,定义的时候前面添加extern 关键字
  • 对一个常量进行引用的时候也必须在引用的前面添加const标识符
  • 常量引用是对const引用的简称
  • 引用的类型必须和引用的对象类型一致,但是两个例外,第一,初始化常量引用的时候允许用任意表达式作为初始值 例如double dval =3.14; const int & ri = dval; 就相当于const int tmp = dval; const int &ri =dval; 编译器创建了一个临时对象。注意此时的绑定对象是tmp而非dval
  • int i=42; const int & r2 = i; 这样的情况下,不允许通过r2修改i的值
  • 指向常量的指针(pointer to const)const int * pi =&pii; 和常量指针(const pointer) int * const pi =&pii;  同理从 右边向左边阅读
  • 常量指针必须进行初始化,初始化之后地址就不能变了
  • 顶层const(top-level const)本身是一个const和底层const(low-level const)则与指针或者引用的复合类型的基本类型部分有关
  • 执行对象的拷贝操作时,拷入和拷出的对象必须具有相同的底层const,或者两个对象的数据类型能够相互转换
  • 常量表达式const expression ,由变量的数据类型和初始值共同决定
  • constexpr变量类型,这个变量一定是常量,且必须用常量表达式(包括constexpr函数)进行初始化
  • constexpr int * q =nullptr;两点, 第一,constexpr指针初始值只能是0或者nullptr或者存储于某个固定地址的对象,第二,constexpr仅对于指针有效,和指针所指向的对象无关const int * p = nullptr;大大不同
  • 类型别名typedef double wages; typedef wages base, p; p是double 的指针,新的形式using SI = Sales_item;
typedef char * pstring; 
const pstring cstr =0; //这里的const修饰的是指针,所以pstring是一个常量指针,而不是指向常量的指针
const pstring *ps;
//不能错误地替换pstring 为 char * --》const char * cstr =0;这样将导致错误的理解
  • auto类型 ,auto 一般会忽视顶层const,而保留底层const
  • decltype 指示符 希望从表达式的类型推断出要定义的变量的类型,但是不想用该表达式的值初始化变量
int i =42, *p = &i, &r =i;
decltype(r+0) b;//b是整形(int),因为运算结果是int
decltype (*p) c;//这里的c是引用(&int),因为decltype解引用就是得到引用
  • Remember that decltype(( variable )) (note, double parentheses) is always
    a reference type, but decltype( variable ) is a reference type only if variable
    is a reference.
  • Headers (usually) contain entities (such as class definitions and const and
    constexpr variables (§ 2.4, p. 60)) that can be defined only once in any given file.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值