C++ primer 读书笔记(2,4,5章节)

来源:互联网 发布:智行火车票小程序源码 编辑:程序博客网 时间:2024/06/08 05:59

第二章

1.关于什么是对象? 一般而言,对象就是内存中具有类型的区域,说的具体一点,就是计算左值表达式就会产生对象。

2.关于初始化,分为直接初始化(direct-initialization)和复制初始化(copy-initialization),直接初始化是把初始化式放在括号里,复制初始化语法用等号(=):

如: int ival(1024);    //direct_initialization

       int ival=1024;    // copy-initialization;

此外,初始化指创建变量并给它赋初始值,而赋值则是擦除对象的当前值并用新的值替代。

3.变量的初始化规则:内置类型变量是否自动初始化取决于变量定义的位置。在函数体外定义的变量都初始化成0,在函数体内定义的内置类型变量不进行自动初始化。

4.const对象默认为文件的局部变量,与其他变量不同,除非特别声明,在全局作用于声明的const变量是定义该对象的文件的局部变量,此变量只存在那个文件中,不能被其他文件访问。

5.引用:引用是一种复合类型,通过在变量名前面天劫“&”符号来定义。在引用的情况下,每一种引用类型都“关联到”某一其他类型,不能定义引用类型的引用,但可以定义任何其他类型 的引用。

    引用必须用于该引用同类型 的对象初始化。

    int ival=1024;

    int &refVal=ival;   //OK

    int &refVal2;        //error: a reference must be initialized

    int &refVal3=10   //error: initializer must be an object

引用是别名,它是绑定对象的另一个名字,作用在引用上的所有操作事实上都是作用在该引用的对象上。

当引用初始化后,只要该引用存在,它就保持绑定到初始化时指向的对象。不可能将引用绑定到另一个对象上。

const 引用是指向const对象的引用

const int ival=1024;

cosnt int &refVal=ival;  //OK

int &ref2=ival;             //error: nonconst reference to a const obeject

非const引用只能绑定到与该引用同类型的对象。

const引用则可以绑定到不同但相关的类型的对象或绑定都右值。

6.,枚举:枚举的定义包括关键字enum,其后是一个可选的枚举类型名,和一个用花括号括起来,用逗号分开的枚举成员列表。

如: enum open_modes(input,output,append);

不能改变枚举成员的值。枚举成员本身就是一个常量表达式,所以也可用于常量表达式能用的任何地方。

枚举类型的对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象来进行。

如: open_modes om1=input;

       open_modes om2=2;         //error: om2 initialized with int

      om1=point;                     //error: point is not a open_modes enumerator

     om2=output;                 //OK.

7.头文件:a:头文件用于声明而不是定义

                  头文件可以定义类,值在编译时就已经知道的const对象和inline对象。

             b:  一些const对象定义在头文件中

               c++中的任何变量都只能定义一次,定义会分批存储空间,而所有对该变量的使用都关联到同一存储空间。当我们在头文件中定义了const变量后,每个包含该头文件的源文件都有了自己的const变量,其名称和值都一样。当该const变量使用常量表达式初始化时,可以保证所有的变量都有相同的值,但是在实践中,大部分的编译器都会用相应的常量表达式来替换对这些const变量的使用,所以,在实践中不会有任何存储空间用于存储用常量表达式初始化的const变量。

第四章  数组和指针

1.数组

非const常量以及要到运行阶段才知道其值的const变量都不能用于定义数组的维数。

字符串字面值包含一个额外的空字符(NULL)用于结束字符串

char c1[]={'c','+','+'};                            //no null

char c2[]={'c','+','+','\0'};                       //explicit null

char c3[]="c++";                                   //null terminator add automatically

数组不允许直接赋值和复制。

用下标访问元素时,vector使用vector::size_type作为下标类型,而数组下标的正确类型则是size_t.

2.指针

许多有用的程序都不可使用数组或者指针实现,现代c++程序采用vector类型和迭代器取代一般的数组,采用string类型取代C风格字符串。

指针初始化和赋值操作的约束

a  0值常量表达式,例如,在编译时课获得0值整型const对象或字面值常量0

b  类型匹配的对象的地址

c   另一对象之后的下一地址

d   同类型的另一个有效指针

int ival;

int zero=0;

const int c_ival=0;

int *pi=ival;                 //error: pi initialized from int value of ival

pi=zero;                     //error: pi assigned int value of zero

pi=c_ival;                  //ok: c_ival is a const with compile-time value of 0

pi=0;                         //ok: directly initialize to literal constant 0

关于void*指针

C++提供了一种特殊的指针类型void*,它可以保存任何类型对象的地址,void*指针只支持几种优先的操作:

与另一个指针进行比较:向函数传递void*指针赋值。不允许使用void*指针操纵它所指向的对象。

关于指针和const限定符

把一个const对象的地址赋给一个普通的,非const对象的指针也会导致编译时的错误。

不能使用void*指针保存const对象的地址,而必须使用const void*类型的指针保存const对象的地址。

如果只向const的指针所指的对象并非const,则可直接给对象赋值或者间接地利用普通的非const指针修改其值,毕竟这个值不是const,重要的是要记住,不能保证指向const的指针所指的值一定不可修改。

关于指针和typedef

typedef string *pstring;

const pstring cstr;

等价于

string *const cstr;

3.动态创建数组

每一个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区(free store)或者堆(heap),C语言使用malloc和free在自由存储区中分配存储空间,而C++语言则使用new和delete表达式实现相同的功能。

可以在数组的长度后面加一堆空圆括号,对数组元素做值初始化。

int *pia=new int[10]();                         //array of 10 initialized ints,  本例中个元素都为0

关于const对象的动态数组。

const int *p=new const int[100];                         //error:uninitialized const array

const int *p=new const int[100]();                        //ok:value-initialized const array

关于新旧代码的兼容: 可以使用C风格字符串对string对象进行初始化或者赋值

string类型的加法操作需要2个操作数,可以使用C风格字符串作为其中的一个操作数,也允许将C风格字符串用作符合赋值操作的右操作数。

c_str函数返回C风格字符串,其字面意思是:“返回C风格字符串的表示方法”。

第五章  表达式

1.new和delete表达式

int *p=new int;                   //p points to an uninitialzed int

int *p=new int();                //p points to an int value_initialized to 0   

值初始化的()必须置于类型名的后面,而不是变量后,例如:

int x();                  //does not value initialze x

这个语句声明了一个名为x,没有参数返回int值的函数

如果指针指向的不是用new分配的内存地址,则在该指针上使用delete是不合法的。

一旦删除了指针所指向的对象,立即将指针置为0,这样就可以非常清楚的表明指针不再指向该对象。

 

原创粉丝点击