C++ Primer笔记(一)变量和基本类型

1、每个C++程序都包含一个或多个函数,而且必须有一个命名为main。return 0表明程序成功执行。main函数的返回值必须是int型。

2、iostream库的基础是两种命名为istream和ostream的类型,分别表示输入流和输出流。流是指要从某种IO设备上读入或写出的字符序列。

cerr对象又叫做标准错误,用来输出警告信息和错误信息给程序的使用者。clog对象用于产生程序执行的一般信息。

3、C++中每个表达式都会产生一个结果,通常是将操作符作用到其操作数所产生的值。当操作符是输出操作符时,结果是左操作数的值,也就是说,输出操作返回的值是输出流本身。同样的,输入操作符返回其左操作数作为结果。

4、使用命名空间,程序员可以避免由于无意中使用了与库中所定义名字相同的名字而引致冲突。其带来的副作用是,当我们使用标准库中的名字时,必须显式地表达出使用的是命名空间std下的名字。

5、C++程序中,大部分出现空格符的地方可用换行符替换。两个例外是:字符串字面值中的空格符不能用换行符替换。空格符不允许出现在预处理指示中。

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

7、当成对注释符号跨越多行时,最好能直观地指明每一行都是注释,C++ primer推荐的风格是在注释的每一行以星号开始。最好是将注释块放在所解释代码的上方。成对的注释符号不能嵌套。

8、当我们试图把一个超出变量取值范围的值赋给一个变量时,其结果取决于这种类型是unsigned还是signed类型

对于unsigned,编译器将该值与unsigned类型可以取值的个数求模,然后取得所得值。

对于signed类型,很多的编译器与unsigned类型的处理方式一致,但不能保证所有编译器都是如此。

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

9、处理长字符串有一个很基本的方法:在一行的末尾加一反斜线符号,可将此行和下一行当做同一行处理。

意:此时反斜线必须是每一行的最后一个字符,其后不能有字符。


10、C++支持两种初始化变量的形式:

1)复制初始化,如int a=100。2)直接初始化 如int a(20);

注意:初始化不等于赋值。

可以与自定义类的初始化来帮助理解。一是在构造函数内初始化,二是调用复制构造函数用其他对象初始化。

而赋值是指擦除对象的当前值并用新值代替。如:

user_defined_class a(199); 

user_defined_class b(a);

user_defined_class b=a;

b(a)与b=a的区别就是初始化与赋值的区别。

对内置类型来说复制初始化和和直接初始化差别很小。对于内置类型,系统有时候会帮我们初始化变量。但只有全局的、静态的或是在名字空间内的变量才会被编译器自动初始化为0。局部变量不被自动初始化。

对于类类型依赖于构造函数。对于没有提供构造函数的类,编译器会自动产生一个默认的构造函数但是它不初始化类内内置类型的各成员变量。


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

声明用于向程序表明变量的类型和名字,可以通过使用extern关键字声明变量而不定义它。它说明变量定义在程序的其它地方。变量可以声明多次,但只能定义一次。如果声明有初始化式,此时它被当做定义。如extern int i=10;

注意:只有当extern声明位于函数外部时才可以含有初始化式。

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

C++primer推荐在使用变量的地方定义变量。


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

全局作用域中定义的非const变量可以在整个程序中访问,而const类型的变量仅仅可在定义它的文件内可见。为了使其具有全局作用域,可以在定义时添加extern,

如在文件1中有extern const int i=10;在文件2中可以声明extern const int i;

来达到访问其他文件的const变量的目的。


13、一旦一个引用绑定到一个对象,必须从一而终,不能再绑定到其他对象。

这一点类似于 char * const p=&a;

非const引用只能绑定到与该类型引用同类型的对象。而const引用还可以绑定到非const类型的对象上。

int i=42;

const  int &r=42;

const int &r2=r+i;   //int temp=r+i;

实际r2绑定到temp,因为temp是无法修改的,此处r2必须是const类型的。


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

如extern int ival=10;double a;

对于头文件不应该含有定义这一规则,有三个例外:

1:头文件可以定义类。2:编译时就确定值得const对象。3:inline函数。

这些实体可在多个源文件中定义,只要每个源文件中的定义是相同的。



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

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


17、C++系统一般由程序开发环境、语言和C++标准库三个部分构成。

C++程序要经历六个阶段,分别是:

1)编辑:保存在磁盘中。

2)预处理:预处理程序处理代码。预处理器在编译器的翻译阶段开始之前会自动执行,这些处理通常是包含其他要编译文件的文本和实现各种文本替换。

3)编译:编译器创建目标代码并将它保存在磁盘中。

4)连接:连接器连接目标代码和库,创建一个可执行的文件并将它保存在磁盘中。若程序编译和连接都没有问题,就会生成可执行程序。

5)载入:载入器首先从磁盘中取得可执行程序,然后将其放入内存中。

6)执行:CPU读取每条指令并执行它,在程序执行时可能会保存新的数据值。


翻译阶段:

由几个步骤组成,组成一个程序的每个(又可能有多个)源文件通过编译过程分别转换为目标代码。

然后,各个目标文件由链接器捆绑在一起,形成一个单一而完整的可执行程序。

链接器同时也会引入标准C++函数库中任何被该程序所用到的函数,而且它也可以搜索程序员个人的程序库,将其中需要使用的函数也链接到程序中。


编译过程:

本身也由几个阶段组成,首先是预处理器处理。

在这个阶段,预处理器在源代码上执行一下文本操作。

例如,用实际值代替由#define指令定义的符号以及读入由#include指令包含的文件内容。

然后,源代码经过解析,判断它的语句的意思。

第2个阶段是产生绝大多数错误和警告信息的地方。随后,便产生目标代码。


目标代码:

是机器指令的初步形式,用于实现程序的语句。

如果我们在编译程序的命令行中加入了要求进行优化的选项,优化器就会对目标代码进一步进行处理,使他效率更高。优化过程需要额外的时间,所以在程序调试完毕并准备生成正式产品之前一般不进行这个过程。

至于目标代码是直接产生,还是先以汇编语言语句的形式存在,然后再经过一个独立的阶段编译成目标文件,对我们来说并不重要。


编译和链接:

1)编译并链接一个完全包含于一个源文件的c++程序 , cc program.cpp

这条命令产生一个称为a.out的可执行程序。

中间会产生一个名为program.o的目标文件,但他在链接过程完成后会被删除。

2)编译并链接几个C++源文件, cc  main.cpp  sort.cpp  lookup.cpp

当编译的源文件超过一个时,目标文件便不会被删除。这就允许你对程序进行修改后,只对那些进行改动过的源文件进行重新编译。

3)编译一个c++源文件,并把它和显式的目标文件链接在一起,cc main.o  lookup.o  sort.cpp

4)编译单个c++源文件,并产生一个目标文件,以后再进行链接,cc-cpp  program.cpp

5)编译几个C++源文件,并为每一个文件产生一个目标文件,cc–cpp  main.cpp  sort.cpp  lookup.cpp

6)链接几个目标文件, cc main.o  sort.o  lookup.o



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值