C++ Primer 3rd 读书笔记1/2(二)

2014-11-24 11:46:26 · 作者: · 浏览: 5
_ptr=π指向const类型的const指针。

const int aa = 100;

int bb = 200;

int cc = 300;

//指向const的指针

const int *p = &aa;

//*p=100;错误

p=&bb;

//*p=100;错误

//const指针

//int *const pp = &aa;错误,非const类型的指针不能指向const常量

int *const pp = &bb;

//pp=&cc;错误

*pp = 100;

int const * ppp = &aa;

ppp = &cc;

10. 引用是没有指针语法的指针,常用语函数的形参,将类对象传递给函数。引用必须初始化。引用一旦定义,不能指向其他对象。指针所有的操作都被应用在它所指向的对象上。

int a = 100; int&p = a;(指向int型的引用)

int *pi = &a;int *&ppi = pi;(指向指针的引用,&和*作用抵消)

指向const的引用可以使用文字常量初始化,例如:const int &p = 3.14;其内部实现是通过为文字常量定义一个变量,然后引用指向该变量进行实现的。int *pi=0;内部其实为:int tmp=0; const int &ri=tmp;而对于非指向const的引用,由于文字常量不能寻址,因此不能这样初始化(int &p=1;×)。

对于const intival = 1024;定义指向ival指针的引用如下:

const int *const&p = &ival;(第一个const说明指向的是常量,第二个const说明是const指针,只能指向1024的地址,因为文字常量的地址是固定的)

引用与指针的区别;

1. 引用必须总是指向一个对象,必须初始化。指针可以为空。

2. 引用之间相互赋值时,改变的是被引用的对象而不是引用本身。

int &ri = ival, &ri2=ival2;ri=ri2;改变的是ival,而不是引用本身。赋值之后两个引用依然指向原来的对象。

11. 枚举:用于指定一个对象含有指定的几个值。Enum Forms{a=2,b,c}.c=4.

12. 数组维数值必须是常量表达式,必须能在编译期间计算出其值。显式初始化的时候可以不写维数值。字符串也是一个数组,但是其包含了额外的“\0”。数组不能被另一个数组初始化,也不能赋值给另一个数组。C++不提供编译器对数组的边界检查。

13. 数组与指针:数组标示符代表数组中第一个元素的地址,它的类型是数组元素类型的指针。

14. vector可以被另一个vector初始化,可以赋值给另一个vector。

15. typedef的一道易错题

Typedef char *cstirng;

Extern const cstring cstr;

问cstr是什么?

不是指向const字符的指针const char *cstr,而是指向char的const指针char * const cstr。

16. volatile修饰符的作用是告诉编译器,该对象的值可能在编译器未监测到的情况下被改变。因此编译器不能武断地对引用这些对象的代码进行优化处理。

17. pair提供key-value形式的存储结构,使用需包含

第四章 表达式

1. %取模运算符号只能应用于整型操作数上,例如char、short、int和long。

2. 关系和逻辑运算符如果应用在整数值的上下文环境中,会自动提升为1或者0.

3. 不能使用诸如a[index--]

4. 利用i++和++i实现Stack。

Push:stack[top++] = value;

Pop:value = stack[--top];

5. sizeof操作符的作用是返回一个对象或类型名的长度。当使用sizeof计算数组时,返回的是数组的整个类型长度,而不是第一元素的长度。Sizeof计算指针时,sizeof(p)=4;siziof(*p)=p指向内存元素的类型大小。Sizeof计算引用时,返回的是引用的类型大小。sizeof a和sizeof(a)两种方式都正确。

size_t st;

st = sizeof st;

std::cout<<"st="<

double *sp = new double[3];

int as[] = {1,2,3,4};

std::cout<<"sizeof(sp)="<

std::cout<<"sizeof(*sp)="<

std::cout<<"sizeof(as)="<

std::cout<<"sizeof(double *)"<

std::cout<<"sizeof(double &)"<

输出结果为:4、8、16、4、8

此外:sizeof(‘c’)=1;sizeof(“c”)=2;【包含\0】sizeof(std::string)=16;string str =”s”;sizeof(str)=16;

6. 系统为程序分配内存的区域称之为空闲存储区或者堆。使用new执行分配内存的操作。所有从堆中分配的对象都是未命名的,new表达式返回的不是对象本身,而是对象的地址,对象所有的操作都是通过地址值间接完成的。使用delete来删除我们从堆中申请的对象。删除单个元素:delete p;删除数组:delete[] p;

7. inta = 3;int b = a + 1.24;首先将a提升为double,然后a+1.24得到double的结果,然后将结果转换为int(编译器会报错)。发生隐形转换的情况如下:

1. 混合运算:int a= 3; double d = 3.243; double dd = a + d;

2. 用一种类型的表达式赋值给另一种类型的对象。 a = d;或者 int *p =0;

3. 把一个表达式传递给一个函数调用,表达式类型与参数类型不同。Extern double sqrt(double); cout<

4. 从一个函数返回一个表达式,表达式与返回类型不同。Double dif(int a,int b){return a b;}

8. 算数运算中:

1. 类型总是被提升为较宽的类型。Int->float->double->long double

2. 小于整形的有序类型的算数表达式都转换成整形。例如char、signed char short等。此外还有enum中的值,boo值也被提升为整形int。

9. 显式类型转换常用命令:static_cast(静态转换,一般的转换)、dynamic_cast(运行时刻识别由指针或引用指向的类对象)、const_cast(const常量转换)和reinterpret_cast。显示类型转换的语法为:castname (expression);

旧式强制转换语法:

1. C++强制转换符号:type(expr)

2. C语言强制转换符号:(type)expr;

10. 任何非const数据类型的指针都可以被赋值为void*。

第五章 语句

1. string*p, p1;定义p为指针,p1为字符串。string *p,*p1;定义p,p1为指针。

2. switch如果不加break,则会从入口点一直执行。

3. break:跳出循环体;continue:跳出本次循环,转而进行洗一次循环。