第2章 变量和基本类型编程
1.(P56)若是使用class关键字来定义类,那么定义在第一个访问标号前的任何成员都隐式指定为private;若是使用struct关键字,那么这些成员都是public。数组
第7章 函数函数
1.数组有两个特殊的性质,影响咱们定义和使用做用在数组上的函数:一是不能复制数组(4.1.1节);二是使用数组名字时,数组名会自动转化为指向其第一个元素的指针。测试
2.当编译器检查数组形参关联的实参时,它只会检查实参是否是指针、指针的类型和数组元素的类型是否匹配,而不会检查数组的长度。spa
3.数组形参可声明为数组的引用。若是形参是数组的引用,编译器不会将数组实参转化为指针,而是传递数组的引用自己。在这种状况下,数组大小成为形参和实参类型的一部分。编译器检查数组实参的大小与形参的大小是否匹配。指针
void printValues(int (&arr)[10]) {/*...*/} int main() { int i = 0, j[2] = {0,1}; int k[10] = {0,1,2,3,4,5,6,7,8,9}; printValues(&i); //error printValues(j); //error printValues(k); //ok:argument is an array of 10 }
第15章 面向对象编程code
1.(P485)使用class保留字定义的派生类默认具备private继承,而使用struct保留字定义的类默认具备public继承。对象
2.(P484)为了使size在Derived中成为public,能够在Derived的public部分增长一个using声明。blog
3.(P485)尽管私有继承在使用class保留字时是默认状况,但这在实践中相对罕见。继承
4.(P486)友元关系不能继承。
5.(P488)引用转换不一样于转换对象。①能够将派生类型的对象传递给但愿接受基类引用的函数时,引用直接绑定到该对象,虽然看起来在传递对象,实际上实参是该对象的引用,对象自己未被复制,转换不会再任何方面改变派生类型对象,该对象仍然是派生类型对象。②将派生类对象传递给但愿接受基类类型对象(而不是引用)的函数时,该派生类对象的基类部分被复制到形参。
6.(P491)派生类构造函数经过将基类包含在构造函数初始化列表中来间接初始化继承成员(不能直接初始化继承成员)。初始化列表不指定初始化的执行次序,首先初始化基类,而后根据声明初始化派生类的成员。
第16章 模版与泛型编程
1.(P530)若是是类型形参,咱们就知道该形参表示未知类型,若是是非类型形参,咱们就知道它是一个未知值。
2.(P530)与全局做用域中声明的对象,函数或类型同名的模版形参会屏蔽全局名字。
3.(P530)用做模版形参的名字不能在同一模版内部重用。
4.(P531)对于模版能够只声明而不定义,在同一模版的声明和定义中,模版形参的名字没必要相同。
template <class T> T calc(const T&, const T&); template <class U> U calc(const U&, const U&);
省略关键字或类型说明符是错误的:
template <class T, U> T calc(const T&, const U&); //error
5.(P352)在函数模版形参表中,关键字typename和class具备相同含义,能够互换使用,两个关键字均可以在同一模版形参表中使用。可是,关键字typename是做为标准C++的组成部分加入到C++中的,所以旧的程序更有可能只用关键字class。
6.(P532)在模版定义内部指定类型:经过在成员前加上关键字typename做为前缀,能够告诉编译器将成员看成类型。
template <class Parm, class U> Parm fcn(Parm *array, U value) { typename Parm::size_type *p; ... }
这些声明给用来实例化fcn的类型增长了一个职责:那些类型必须具备名为size_type的成员,并且该成员是一个类型。
7.(P533)非类型形参:
template <class T, size_t N> void array_init(T (parm&)[N]) { for(size_t i = 0; i != 0; ++i) parm[i] = 0; }
当调用array_init时,编译器从数组实参计算非类型形参的值:
int x[42]; double y[10]; array_init(x); array_init(y);
8.(P534)泛型编程的两个重要原则:模版的形参是const引用;函数体中的测试只用<比较。