C++ Primer中文版第四版 读书笔记


 2011.8.10

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

extern double pi = 3.1416;  //pi 是一个全局变量,这是一个定义

P50: 在全局作用域声明的const 变量是定义该对象的文件的局部变量(仅作用在该文件中),要使 const 变量能够在其他文件中被访问,必须显示指定为extern。

引用就是对象的另一个名字,主要用于函数的形式参数;不能定义引用类型的引用,但可以定义其他任何类型的引用。

引用必须在定义时就进行初始化,且初始化后一直指向初绑定的对象。

const 引用可以用不同类型但相关的对象来初始化;也可以用右值进行初始化。

const int &r = 42; //用右值

double dval = 3.14;

const int &ri = dval; //用double 来初始化,这只适用于const的情况

P56:C++中struct 与 class 的区别仅在于默认访问级别,前者默认是public的,后者默认是private的。

P59:头文件中不应含有变量或函数的定义,但有三个例外:

1. 头文件中可以定义类

2. const 对象,值在编译时就已经知道的const对象

3.inline函数

P75:当string对象和字符串字面值进行混合连接时,+ 操作符的左右操作数必须至少有一个string类型的。

 

P80:Q: 标准库vector如何(默认)初始化没有定义任何构造函数的类类型?

A:这种情况下,标准库仍产生一个带初始值的对象,这个对象的每个成员进行了值初始化。??

容器与迭代器,暂时看成更高级的数组和指针。

 

bitset<32> bv(1010101); //好吧,第一眼看错了,1010101是十进制

 

2011.8.11

 

如果数组的元素类型是类类型,不管数组在哪里定义都自动调用该类的默认构造函数进行初始化;

如果该类没有默认构造函数,则必须为该数组的元素提供显式初始化。

一个vector对象可以用另一个vector对象直接初始化。

 c++中提供一种void * 指针类型,它可以保存任何类型对象的地址,不允许用void * 指针操纵它所指向的对象。

 

指针和引用的比较

定义引用时必须初始化;赋值行为的差异,给引用赋值是修改该引用所关联的对象的值,给指针改值就使指针指向了不同的对象。

理解指向const  对象的指针和const 指针的不同含义。

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

不能保证指向常量的指针所指对象的值一定不可修改。

 

P112:在typedef 中使用指针;const的位置不同会引起理解的偏差。

 在堆heap中创建的动态数组是没有名字的,只能通过地址间接访问堆中的对象。

 

2011.8.12

一般的数组可以用初始化列表为数组元素提供不相同的初值;

动态分配的数组,其元素只能初始化为元素类型的默认值:

int * arr = new int[10](); //在g++中测试,()使每个元素初始化为0

 c++中允许定义类类型的const数组,但该类类型必须提供默认构造函数。

不能用数组直接初始化一个数组,但可以用数组(还可以是其前缀子集)来初始化一个vector对象。

 

typedef int int_array[4]; //给一个大小为4的int数组取一个别名为int_array
int_array * ip = ia;//用一个二维数组名ia初始化ip


2011.8.15

 

关系操作符不能串接使用,如   if(i<j<k) 

位操作符使用整型的操作数,其操作的整型可以是有符号的和无符号的,位操作符如何处理符号位依赖于机器。

& |  异或,<< 左移。

使用复合赋值操作时,左操作数只计算了一次;而使用相应的长表达式时,该操作数计算了两次。

对于++ 和--操作符,使用前置操作所要做的工作更少。

理解类似于 *iter++ 这样的语句。

C++ 为什么不叫做++C。

 关于delete 和delete[]。

逗号表达式的值是其最右边表达式的值。

在delete之后,最好将指针设为0、空、NULL。


const int * pci = new const int(1023);  //动态创建一个常量对象

delete pci;                             //在堆中创建的常量也是可以被回收的

 

使用const_cast将转换掉表达式的const性质。

求最大公约数——辗转相除法

 

P201:文中说C语言中,具有const 形参或非const 形参的函数并无区别。//有待考证

 

千万不能返回局部变量的引用。

求最大公约数的递归版本P216。

内联函数的定义必须在头文件中。


 编译器隐式的将在类内定义的成员函数当作内联函数。

 

为所有形参提供默认实参的构造函数也属于默认构造函数,所以说默认构造函数的形参列表不一定为空。

类中的静态成员函数不能被声明为const,

静态成员函数也不能被声明为虚函数。


(待续)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值