C++ Primer 第五版:第2章

*****C++ Primer 第五版第2章学习笔记*****

*****实验代码在Red Hat 6.6或VS 2013中调试*****

*****文章内容依据当前知识撰写,存在认识的局限性*****

 

今天学习C++ Primer 的第2章,还没有看完,先写一点看书的心得和笔记。

对象类型决定对象包含的数据和能参与的运算操作,同时还决定了存储空间大小。
算术表达式中不要使用char,因为不同机器实现不一样,导致结果不同。
单精度计算不一定比双精度快。

C++类型不匹配时,是自动进行类型的转换。

C++的变量初始化有四种方式:

1.int a=0;

2.int a={0};

3.int a{0};

4.int a(0);

使用花括号初始化变量的方式称为:列表初始化。

对内置类型使用列表初始化去初始化一个值,且2者类型不通,存在丢失信息的风险,列表初始化将无法完成,例如:

long double a=3.1415926;

int b{a};  //编译报错,无法完成。

 

如果定义变量时没有指定初值,则变量被默认初始化(default initialized),此时变量被赋予了"默认值"。默认值到底是什么由变量类型决定,同时定义变量的位置也会对此有影响。

如果是内置类型的变量未被显式初始化,它的值由定义的位置决定。定义于任何函数体之外的变量被初始化为0。然而一种例外情况是,定义在函数体内部的内置类型变量将不被初始化(uninitialized)。一个未被初始化的内置类型变量的值是未定义的,如果试图拷贝或以其他形式访问此类值将引发错误。

每个类各自决定其初始化对象的方式。而且,是否允许不经初始化就定义对象也由类自己决定。如果类允许这种行为,它将决定对象的初始值到底是什么。

上面这段话讲的内容挺多,学过C语言的朋友应该能知道,这段话和变量的作用域是有很大关联的:

其中静态变量只初始化一次,未显式初始化时,默认初始化为0,这就是为什么【定义于任何函数体之外的变量被初始化为0】的原因。
PS:静态变量和外部变量在程序调入内存时已准备就绪。
 
另外,C++不同于C,如果内置类型的局部变量没有被初始化,是不能以任何方式访问,包括输出和复制,VS2013编译时会报错!
 
最后,从课本上学习到的一点就是:不要使用未初始化的对象!
 
C++是一种静态类型(statically typed)语言。
 
定义引用时,程序把引用和它的初始值绑定(bind)在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用将和它的初始值对象一直绑定在一起。因为无法令引用重新绑定到另外一个对象,因此引用必须初始化。
 
因为引用本身不是一个对象,所以不能定义引用的引用。这句话是什么意思呢?举个例子:
int c;
int &b=c;
int &a=b ;  //a成为另一个c的引用.
int &&d=b;  //这里即体现了引用(&d)的引用(&&d),
 

指针值

指针的值(即地址)应属下列4种状态之一:

1.指向一个对象。

2.指向紧邻对象所占空间的下一个位置。  //这种我没理解什么意思,搜索了一下,发现有篇文章解释是int *p = &i ;   p++;

3.空指针,意味着指针没有指向任何对象。

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

另外,为初始化的指针是极度危险的。
 

只要指针拥有一个合法值,就能将它用在条件表达式中。和采用算术值作为条件(参
见2.1.2 节,第35 页)遵循的规则类似,如果指针的值是0,条件取false:
int ival = 1024;
int *pi = 0; // pi 合法,是一个空指针
int *pi2 = &ival; // pi2 是一个合法的指针,存放着ival 的地址
if (pi) // pi 的值是0,因此条件的值是false
if (pi2) // pi2 指向ival,因此它的值不是0,条件的值是true

这里的if (pi)   pi 的值是0,因此条件的值是false,起初觉得这是否是错误的用法,pi是个指针,其值是一个地址,不可能拿来做bool判断,后来在群里求教了下,一个大虾给了指点,其实if ( pi )是与if ( pi != NULL )等价的,好好思考下是不是这样呢:D,是的,两者是等价的,故判断的结果是false。
 
最后还要说一下第一章的一个while循环的知识点,在做第一章的练习题时,我看到了这样一段代码
while (a>b)
  if(m>n)
    ....;
  else
    ....;

上面这段代码while循环后跟了if,else,并且while循环体没有加花括号,那么while循环体是到哪为止呢,我之前不理解,一直以为到第一个分号截止,直到看到这段代码,才知道if...else...这段代码是看作一个整体,因此上面的都是while循环。

 

暂时写到这,待续。

继续:不能定义指向引用的指针

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。