`
xitong
  • 浏览: 6157467 次
文章分类
社区版块
存档分类
最新评论

C++ primer第二次阅读学习笔记(第1、2章)

 
阅读更多

C++primer第二次阅读学习笔记(第1、2章)

一年前开始了C++primer的第一遍阅读,一年之后重新拾起C++primer。原因有二,一:第一遍阅读时刚开始接触C++,对C++认识有限,学习C++primer不可能有多么深刻的理解,一年的开发让我对C++有了不一样的认识,这时再回过头来查漏补缺。二:想清楚了不考研了,但是这并不代表我甘于做一个普通的程序员,离毕业还有一年的时间,这一年多的时间,我准备好好将原来看过的或是想看却没看过的书都看看。毕业我想去大公司,没有这些知识很难进去。废话不多说,开始学习!!

第一章

cin,cout之所以可以级联使用,是因为它们返回的是它们本身的引用。

当成对注释符号跨越多行时,最好能直观地指明每一行都是注释,C++primer推荐的风格是在注释的每一行以星号开始。现在理解为何VA的注释都是这种风格。最好是将注释块放在所解释代码的上方。成对的注释符号不能嵌套,这在实际开发中早有体会。

当我们试图把一个超出变量取值范围的值赋给一个变量时,其结果取决于这种类型是unsigned还是signed类型。对于unsigned,编译器将该值与unsigned类型可以取值的个数求模,然后取得所得值。对于signed类型,很多的编译器与unsigned类型的处理方式一致,但不能保证所有编译器都是如此。

在对程序进行计数时,使用unsigned类型比较明智。这可以避免值越界,导致结果为负数的可能。有些机器上使用double类型比使用float类型计算要快的多,longdouble类型提供的精度通常没有必要,而且还需要承担额外的运行代价。

处理长字符串有一个很基本的方法:在一行的末尾加一反斜线符号,可将此行和下一行当做同一行处理。注意此时反斜线(backslash)必须是每一行的最后一个字符,其后不能有字符。

第二章

C++支持两种初始化变量的形式:1,复制初始化,如inta=100。2,直接初始化如inta(20);要明白一点:初始化不等于赋值。这可以拿自定义类的初始化来帮助理解。一是在构造函数内初始化,二是调用复制构造函数用其他对象初始化。而赋值是指擦除对象的当前值并用新值代替。如

user_defined_classa(199);

user_defined_classb(a);

user_defined_classb=a;

b(a)与b=a的区别就是初始化与赋值的区别。对内置类型来说复制初始化和和直接初始化差别很小。

对于内置类型,系统有时候会帮我们初始化变量。但只有全局的、静态的或是在名字空间内的变量才会被编译器自动初始化为0。局部变量不被自动初始化。对于类类型依赖于构造函数。对于没有提供构造函数的类,编译器会自动产生一个默认的构造函数但是它不初始化类内内置类型的各成员变量。具体可参考《深度探索C++对象模型》

C++程序通常有许多文件组成,为了让多了文件访问相同的变量,C++区分了声明和定义。

声明用于向程序表明变量的类型和名字,可以通过使用extern关键字声明变量而不定义它。它说明变量定义在程序的其它地方。变量可以声明多次,但只能定义一次。

如果声明有初始化式,此时它被当做定义。如externinti=10;另外注意只有当extern声明位于函数外部时才可以含有初始化式。

任何在多个文件中使用的变量都需要有与定义分离的声明。在这种情况下,一个文件含有变量的定义,使用该变量的其它文件则包含该变量的声明。

C++primer推荐在使用变量的地方定义变量,在其他地方好像不推荐这种方式。

const常量和引用一样,必须在定义时初始化。

全局作用域中定义的非const变量可以在整个程序中访问,而const类型的变量仅仅可在定义它的文件内可见。为了使其具有全局作用域,可以在定义时添加extern,如在文件1中有externconstinti=10;在文件2中可以声明externconstinti;来达到访问其他文件的const变量的目的。

一旦一个引用绑定到一个对象,必须从一而终,不能再绑定到其他对象。这一点类似于char*constp=&a;非const引用只能绑定到与该类型引用同类型的对象。而const引用还可以绑定到非const类型的对象上。

inti=42;

constint&r=42;

constint&r2=r+i;//inttemp=r+i;实际r2绑定到temp,因为temp是无法修改的,此处r2必须是const类型的。

头文件仅仅用于声明而不是用于定义,且会被包含在多个源文件中,因此用于定义的语句不应该放在头文件中。如externintival=10;doublea;

对于头文件不应该含有定义这一规则,有三个例外:1:头文件可以定义类2:编译时就确定值得const对象3:inline函数。这些实体可在多个源文件中定义,只要每个源文件中的定义是相同的。

当我们在头文件中定义了const变量后,每个包含该头文件的源文件都有自己的const变量,其名称和值是一样。但不是一个。因为const变量默认的作用域是定义它的文件,因此各个文件定义自己的const变量是合法的。

预处理器变量的名字在程序中必须是唯一的,我们可以使用类名为预处理器变量的名字来防止程序中预处理器变量重名的问题。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics