C++ Primer Chap5-7 总结

来源:互联网 发布:运营商用户数据 编辑:程序博客网 时间:2024/06/06 00:04

Chap5:

悬垂else:else与它最近的尚未匹配的if匹配,或者用花括号使其成为一个块。

 

switch(整形/字符型){case 整形/字符型: break;default: break; } case里最好也用大括号,方便定义局部变量。

 

break:用于终止最近的switch/循环的块,来到块结束的下一句。

 

continue:终止最近的switch/循环的块,并开始下一个循环。

 

goto:先要有一个标号,标注goto到这里。

 

throw:异常检测。

 

try…catch…:try语句块中抛出的异常通常会被某个catch子句处理,try通过逐层回退寻找适当类型的catch子句,若最终还是没能找到任何匹配的catch子句,程序转到名为terminate的标准库函数,如果一段程序没有try语句块并且发生了异常,系统会调用terminate函数并终止当前程序的执行 P174。

 

异常头文件:stdexcept里面的类创造的对象要初始化

 

Chap6:

局部静态对象:在程序的执行路径第一次经过对象定义语句时初始化,并且直到程序终止才被销毁,static。

 

在函数的声明中经常省略形参的名字,最好在头文件中声明在源文件中定义。

 

如果形参是引用类型,它将绑定到对应的实参上;否则,将实参的值拷贝后复制给形参,在C++中,建议使用引用类型的形参代替指针。

 

使用引用形参可以保存额外信息,以返回多个参数。

 

当用实参初始化形参时会忽略掉顶层const,即当形参有顶层const时,传给它常量对象或者非常量对象都是可以的;但不可以实参是const,形参不是const。

 

不能把const对象、字面值传递给普通的引用形参,所以尽量使用常量引用作为形参

while(beg!=end) { }的用法。

 

使用数组的引用形参:void print(int (&arr)[10]);

 

多维数组的函数声明:void print(int (*matrix)[10]);

 

int main(int argc, char **argv) //argv是一个数组,它的元素是C风格字符串的指针

为了编写能处理不同数量实参的函数,C++11新标准提供了两种主要方法:如果所有的实参类型相同,可以传递一个名为initializer_list的标准库类型,还有一种特殊的实参类型(即省略符),可以用它传递可变数量的实参,不过需要注意的是,这种功能一般只用于与C函数交互的接口程序。

 

initializer_list<string> list作为形参,{””,””,””}作为形参,在函数体中可以用迭代器和范围for。

 

不要返回局部对象的引用或指针。

 

函数的返回类型决定函数调用是否为左值,调用一个返回引用的函数得到左值,其他返回类型得到右值。

 

main()返回值:在cstdlib头文件下,定义了EXIT_FAILURE和EXIT_SUCCESS。

 

递归:if(val>1) return func(val-1)*val。

 

尾置返回类型:auto func(int t) -> int (*)[10]。

 

不允许两个函数除了返回类型外其他所有的要素都相同,假设两个函数,它们的形参列表一样但是返回类型不同,则第二个函数的声明是错误的。

 

在函数重载中,无法区分顶层const,可以区分底层const。

 

return const_cast<>:将非const的实参转成const返回。

 

在不同的作用域中无法重载函数名,局部可以隐藏外部的函数声明。

 

函数的默认实参:在声明时就给形参赋值,需要注意的是,一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值;默认实参负责填补函数调用缺少的尾部实参。

 

当设计有默认实参的函数时,其中一项任务是合理设置形参的顺序,尽量让不怎么使用默认值的形参出现在前面,而让那些经常使用默认值的形参出现在后面。

 

在给定的作用域中一个形参只能被赋予一次默认实参,即后续声明只能为之前那些没有默认值的形参添加默认实参,而且该形参右侧所有形参必须都有默认值。

 

constexpr函数:函数的返回类型以及所有形参的类型都得是字面值类型。

 

函数指针:不能直接把函数作为形参,但形参可以是指向函数的指针,指针类型必须与重载函数中的某一个精确匹配,函数名可以当作实参使用。

 

不能返回函数,但可以返回函数类型的指针。

 

重载函数匹配:P217。

 

Chap7:

接口:用户所能执行的操作;实现:类的数据成员、负责接口实现的函数以及定义类所需的各种私有函数

 

this:当我们调用一个成员函数时,用请求该函数的对象地址初始化this,默认情况下,this的类型是指向类类型非常量版本的常量指针

 

定义成员函数:std::string isbn() const {returnbookNo;}

 

编译器分两步处理类:首先编译成员的声明,然后才轮到成员函数体。因此,成员函数体可以随意使用类中的其他成员而无须在意这些成员出现的次序。

 

return *this; 返回的是引用。

 

合成的默认构造函数:只要当成员全都被赋予了类内初始值时,这个类才适合

 

构造函数:Sales_data() = default;

构造函数初始值列表:Sales_data(const std::string&s, unsigned n, double p): bookNo(s), units_sold(n), revenue(p*n) { };

在类的外部定义构造函数:Sales_data::Sales_data(std::istream&is) {read(is, *this);}。

 

友元:如果类允许其他类或函数作为它的友元,在类里作友元声明:friend std::istream&read( , );最好在类开始或结束前的位置集中声明友元。友元函数在使用前一共要出现三次:1.友元声明 2.头文件内声明 3.源文件内定义。

 

定义在类内部的成员函数是自动inline的,最好的是类内声明函数不加inline,类外定义加inline。

 

mutable:即使在const成员函数内,也可以改变,mutable size_t ival;

 

基于const的重载:P248。

 

友元类:如果一个类指定了友元类,则友元类的成员函数可以访问此类包括非公有成员在内的所有成员,友元关系不存在传递性。

 

令另一个类的成员函数成为友元函数,必须明确指出该成员函数属于哪个类,重载的友元函数的每一个都需要声明。

 

即使我们仅仅是用声明友元的类的成员调用该函数,它也必须是声明过的,即友元声明并非是普通的声明,仍然要进行普通的声明。

 

在类外,对于类的成员的操作要带有域,类内可以省略。

 

类的定义分两步:首先编译成员的声明,直到类全部可见后才编译函数体(只适用于成员函数体中用的名字;包括返回类型或者参数列表中的名字必须在使用前确保可见)。

 

名字查找:1.成员函数内使用之前2.类内所有成员3.函数定义之前的作用域。

 

如果成员是const、引用,或者属于某种未提供默认构造函数的类类型,我们必须通过构造函数初始值列表来为这些成员提供初始值。

 

如果一个构造函数为所有参数都提供了默认实参,则它实际上也定义了默认构造函数。

 

静态成员:与特定的对象无关,只与类本身相关,static只能出现在声明一次,一般来说不在类的内部初始化静态成员,而在类外定义,此时定义不能用static。如果静态成员要在类内定义,必须要求是字面值常量类型的constexpr:static constexpr int period=30,若这个值还要作传递,则还需要在类外再次定义,但不用写初始值。

 

静态成员可以作为默认实参。

 

静态成员函数:不能使const的,也不能在静态成员函数内使用this指针。

0 0