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

本文详细介绍了C++中的变量声明与定义、作用域规则、引用与指针的概念及用法,包括常量引用、指向常量的指针与常量指针的区别等关键知识点。
  • 列表初始化的时候{ },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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值