2021-04-30 C++ primer(第5版)第二章 基础之变量与基本类型 学习笔记

(本文主要内容总结或摘抄自C++ primer中文版(第5版)( Stanley B. Lippman、Josée Lajoie、Barbara E. Moo著,王刚、杨巨峰译,电子工业出版社),如有侵权请联系删除。)

列表初始化,例:

int i(0); 

int{0};     //若为浮点数,存在数据丢失的风险,则不会执行,C++11功能;

声明变量,例:

extern int i; //声明而非定义

int j; //声明并定义

函数体内部试图初始化由extern标记的变量会出错

注意:变量只能被定义一次,但可以被声明多次

变量命名规范:

(1)体现实际含义

(2)变量名一般用小写字母

(3)类名一般以大写字母开头

(4)用student_loan或studentLoan代替studentloan

注意:当你第一次使用变量时再定义它

全局变量与局部变量:当局部变量与全局变量重名时,用::name来访问全局变量,但不建议使用于全局变量同名的局部变量

引用:为对象另起一个名字,例:

int ival=1024;

int &refVal=ival;   //refVal是ival的另外一个名字

int &refVal2;   //错误,引用必须初始化

注意:不能定义引用的引用

允许一条语句定义多个引用,例:

int i=1024, i2=2048;

int &r1=i3, &r2=i2;

指针:指向另外一种类型的复合类型,定义方法如下:

int *ip1, *ip2;

double dp, *dp2;

取地址符为&,取内容符为*

注意:引用不是对象,不能定义指向引用的指针

注意:指针类型必须严格匹配,例:

double dval;

double *pd=&dval;   //正确

double *pd2=pd;   //正确

int *pi=pd;   //错误

pi=&dval;   //错误

指针的值应属于下列4种状态之一:

(1)指向一个对象

(2)指向紧邻对象所占空间的下一个位置

(3)空指针,意味着没有指向任何对象

(4)无效指针,也就是上述情况之外的其他值

空指针:不指向任何对象的指针,在试图使用一个指针之前可以先检查它是否为空,以下为几个生成空指针的方法:

int *p1=nullptr;

int *p2=0;   //需要首先#include cstdlib

int *p3=NULL;

注意:不能把int变量直接赋值给指针,无论int变量是多少

个人理解:在C++中对NULL的定义是(void *)0,也就是把0强制转换成无返回值的*类型,因此NULL实际上是指向0的地址0x00000000,所以*p2=0也就是将0的地址赋给p2,因此p2现在指向nullptr

注意:建议初始化所有指针

注意:初始化的时候可以用int *pi=0;将pi赋值为空指针,后面若pi的值改变,将pi赋空只能用pi=0,若用*pi=0,则改变的是*pi的值,也就是pi地址处存放的值,并不改变pi的值,例:

int *pi=0;   //将pi赋为空指针

int i=42;

pi=&i;

*pi=0;   //pi的值不为空,i的值变为0

注意:任何非0指针对应的条件值都是true

void*类型:是一种特殊的指针类型,我们不知道这个指针指向的对象到底是什么类型,因此无法确定能在它上面做哪些操作

指向指针的指针:指针是内存中的对象,也有自己的地址,因此允许把指针的地址存放到另一个指针当中,例:

int ival=1024;

int *pi=&ival;

int **ppi=π

指向指针的引用:引用本身不是一个对象,因此不能定义指向引用的指针,但指针是对象,所以存在对指针的引用,例:

int i=42;

int *p;

int *&r=p;

r=&i;

*r=0;   //将i的值改为0

const限定符:定义不能被修改的变量,例

const int bufSize=512;

若const变量不是常量表达式,又想多个文件共同使用该const变量,解决办法:

//file_1.cc,定义

extern const int bufSize=fcn();

//file_2.h头文件

extern const int bufSize;

const的引用:可以对const变量进行引用,但是对引用的修改不能改变const变量的值

指向常量的指针:不能用于改变其所指对象的值,例:

const double pi=3.14;

double *p=π   //错误

const double *p1=π   //正确

*p1=42;   //错误,不能给*p1赋值

const指针:指针的值不能被改变,例:

int a=0;

int *const b=&a;   //a将一直指向b

const double pi=3.14259;

const double *const pip=π   //pip是一个指向常量对象的常量指针

顶层const表示指针本身是个常量

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

constexpr(C++11新标准):允许将变量声明为constexpr类型,该变量一定是常量,必须用常量表达式初始化,例:

constexpr int mf=20;

constexpr int limit=mf+1;

constexpr int sz=size();   //只有当size()是一个constexpr函数时才正确

字面值类型,编译时就能得到计算,简单,显而易见,容易得到

注意:constexpr声明中定义指针,则限制只对指针有效,对指针指向的对象无关

类型别名typedef和using,例:

typedef wages base, *p;   //base是double的同义词,p是double*的同义词

using SI= Sales_item;

注意:如果某个类型别名指代的是复合类型或常量,把它用到声明语句里会产生意想不到的后果,慎用,参考C++ primer61页

auto:让编译器自动推断变量类型,例:

auto item=val1+val2;

auto i=0,*p=&i;   //正确,i是整型,p是整形指针

auto sz=0,pi=3.14;   //错误:sz和pi的类型不一致

decltype:希望从表达式的类型推断出要定义的变量的类型,又不想用该值初始化,例:

decltype(f()) sum=x;   //sum的类型就是函数f的返回类型

C++头文件保护符,例:

#ifndef SALES   //若未定义则为真则执行至#endif,否则为假跳至#endif

#define SALES

#include<string>

struct Sales{

   string bookNo;

   unsigned sold=0;

};

#endif

 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值