c++ primer summary

  • 格式:docx
  • 大小:61.39 KB
  • 文档页数:30

Primer c++ 5 chapter 8getline()含有三个参数,getline(cin,str)以回车符为结束标志。

所以运行时需要敲2次回车才能显示string。

cin,最常用的输入,会自动把回车符,空格,tab等不可见字符滤掉。

当接受一个字符串时,遇到不可见字符会结束输入。

cin.get();从输入流中读取一个字符或者数字,注意回车是滤不掉的。

接受字符串时,当大于字符串长度或者遇到\0时结束。

cin.getline(str,size);以\0结束。

引用,指针,变量的作用域,函数的返回值,针对第8章编程练习5,6题引申出的问题。

参见第8章相关内P247引用变量必须在定义的同时进行初始化。

引用变量是变量的别名,修改引用变量的同时也修改了变量,所以可以通过按引用传递值来交换变量。

按值传递和按引用传递各有优点。

不要将表达式赋给实参,会出现警告错误。

如果实参和引用参数不匹配,将生成临时变量(只在函数调用期间存在),使得引用参量成为该临时变量的引用,且此引用参数是const。

对于常量引用,当实参类型正确,但不是左1值(非左值指的是字面常量和含有多项式的表达式),或者实参类型不正确,但可以转化为正确类型时才引入临时变量。

尽可能将形参声明为const。

引用经常用于结构和类。

通常将返回的引用声明为const。

返回机制通常将返回值复制在临时存储区域中,随后调用程序将访问该区域。

而返回引用意味着调用程序不需拷贝直接访问该返回值。

返回引用的函数实际是被引用变量的别名。

返回引用时要避免返回函数结束时不再存在的内存引用。

ostream类输出的格式化ios_base::fmtflags initial;initial = ostream.setf(ios_base::fixed);ostream.setf(ios_base::showpoint);ostream.precision(2);//set showpoint like this until next setingostream.precision(n)os.width(10);// only function in next output and then set it default if you don’t set width. ………………………..ostream.setf(initial);2传递类对象的参数的标准方式是按引用传递。

默认参数值必须通过函数原型声明,必须从右往左添加。

函数重载(overload)的关键是特征标(参数列表的参数数目,参数类型,参数排列顺序)。

函数名称相同,特征标不同。

参数引用和参数本身被视为一样的。

重载的实现是编译器根据同名函数的不同参数列表生成不同的不同的函数。

函数覆盖(override):派生类重写父类的虚函数,参数列表相同,返回值和父类相同或者是父类的子类。

函数模板:函数的通用描述。

template<class T>void fuction_name(T & varible1, T & v2,…);使用函数模板的好处是,可以使生成不同参数类型的函数更简单方便。

但并不会缩短可执行代码。

最终生成的代码并不包含函数模板。

显式具体化(explicit specialization):一个具体化函数定义。

不使用模板函数,需要独立定义。

其匹配优先级高于模板,低于非模版函数。

3函数原型为template<>type1 function<type>1(type & a, type & b);模板实例化(explicit instantiation):函数原型为template type1 function<type>2(type & a, type & b);指向非const数据的指针和引用优先于非const数的指针和引用参数匹配。

const和非const之间的区别只限于指针和引用指向的数据。

实参经过允许的转化而和形参匹配。

非模版函数优于模板。

同为模板函数时,较具体的模板函数(匹配时执行的转换最少)优先级高。

c++ primer 5 chapter 9常规全局变量只有在已经定义(为其分配内存)之后再在其他文件中加extern关键字声明,在声明的同时不允许初始化,此声明只表示是已有变量的引用。

静态变量在固定的内存中,不需要堆栈。

在整个程序执行期间都存在。

默认初始化为0,只能用常量表达式来进行初始化.可能具有内链性。

1<>中的type可以省略的4寄存器变量是自动变量,不放在内存中,不能将地址操作用于寄存器变量。

自动变量的初始化,可以用一切有值的表达式,自动变量的作用域是局部的,没有连接性。

说明符:auto, register, static, extern,mutable(即使结构体为const,仍可以修改有此关键字的成员变量)cv-限定符:const, volatile。

const全局变量相当于静态全局变量,为内链性。

这样不同的文件就可以包含相同的头文件,因为常规全局变量不能再重复定义。

externconst全局变量,可以直接初始化,每个文件中都是这种形式。

没有定义和声明之分。

using声明比using 编译更安全。

using声明只引入指定的名称。

如果该名称和局部变量冲突,编译器将发出错误信息。

Using编译指令导入所有的名称,和局部变量冲突时,局部变量会覆盖它。

未命名的名称空间的作用域是本文件内部从声明点到声明域结尾。

c++ primer 5 chapter 10类描述和结构声明类似,唯一的区别是类默认是privite,结构体则为public.cerr 和cout一样都是ostream对象,区别在于操作系统重定向只影响cout。

cerr用于输出错误信息。

同一个类的所有对象各自存储数据成员,但共享成员函数(也称方法)。

不同对象调用类方法时访问同一内存。

对类对象进行值设置时,尽量用初始化(效率比较高)而不用赋值方式。

只要类方法不修改类对象就要将其声明5为const(在类方法函数紧跟const)。

当构造函数只有一个参数时,可以像赋值一样将一个同类型的常数赋给类对象。

类的头文件 #ifndef SOCKET_H#define SOCKET_H………………………………#endif构造函数:类数据成员名一般加前缀m_。

构造函数用来创建对象,定义了构造函数后要为类提供默认构造函数,或者重载定义一个没有参数的构造函数,或者为已定义的构造函数的所有参数提供默认值。

隐式调用构造函数的时候,不使用圆括号。

this指针:指向用来调用成员函数的对象。

作为隐藏参数提供给对象成员函数,不能在全局函数和静态函数中使用,只在成员函数中有意义,不占用对象的空间。

大多数编译器通过寄存器传递this指针。

指针在成员函数的开始执行前构造,在函数结束后清除。

要创建类对象数组,类对象必须有默认构造函数。

作用域为整个类的常量在私有中定义为static constint。

这种定义只能适用于整型常量。

类声明中的类对象在对象化之前都未分配内存空间。

ADT :abstract data type 抽象数据类型6尽量使用正确的数据类型,使得程序所需的内存最小。

如果方法需要显式地引用调用它的对象,可以用this指针。

*this 是该对象的别名。

c++ primer 5 chapter 11重载的限制:1.重载后的操作符至少有一个操作数是用户定义的类型。

2.只能通过成员函数重载的操作符有:赋值操作符=,函数调用操作符(),下标操作符[],通过指针访问类成员的->友元:原型放在在类声明中,其前面加关键字friend.不是类成员函数,但和类成员函数有相同的权限。

定义的时候不加关键字。

第十五章第一节有关于友元类的相关知识。

当类有只有一个参数的构造函数时可以进行隐式类型转换(将参数类型转换为类类型。

注意,构造函数只能将某种类型转换为类类型,要想将类类型转换为其他类型,需要用到转换函数。

)。

例如有一个socket类,可以sockesoc = 90.但由于存在隐患,一般为只有一个参数的构造函数加关键字explict禁止隐式转换,但可以显显式转换。

例如 socket cat = socket(90) or socket cam = (socket)90;转换函数是用户自定义的强制类型转换。

转换函数必须是类方法,没有参数,没有返回类型,类类型转换为typename类的声明形式为:operatortypename() 。

转换函数同样地有隐式转化,自动转换的困扰。

所以要用功能相同的非转换函数代替转换函数。

当一个类定义多个转换函数时,会出现二义性,最好使用显式的强制类型转换指出要使用哪个转换函数。

注意友元函数和成员方法的区别和联系,尤其重载操作符的参数为两个不同的类型时,还要注意转换函数,合理利用转换函数可以简化程序。

7c++ primer 5 chapter 12要创建对象数组,类必须有默认构造函数(不含参数,但在函数体中设置了特定的值;或者含有参数但都设置了默认值),而且默认构造函数只能有一个。

复制构造函数原型 class_name (constclass_name&),当新建对象初始化为同类现有对象时,按值传递时,函数返回对象时,都将调用此函数。

所以,经常是按引用传递对象。

此函数将逐个复制非静态成员。

为解决静态成员计数问题,可以显式地调用复制构造函数,在其中统计静态量。

类中包含new初始化的指针成员时,要创建复制构造函数实现深度复制,不仅复制指针内容,还要复制所指向的数据。

默认复制构造函数不复制静态成员。

默认赋值操作符与复制构造函数类似,两者总是一起出现。

唯一不同的是,赋值操作符函数体开始部分要先进行检查自我复制,不是this的话,先删除利用new分配的内存和内容。

剩下的步骤和复制构造函数一样。

返回*this。

所以函数返回类型为类引用。

new[]和delete[]是配对使用的,new和delete对应。

以其他方式初始化的指针有可能不能被释放或者结果是不确定的。

如果有多个构造函数,要统一用new或new[]。

因为只有一个析构函数。

空指针除外。

C++中用0来表示空指针(即,动态分配类型的一个内存,将其用\0填充。

此动态分配需要用delete[]删除)。

P413不能在类声明中初始化静态变量,整型或枚举型const除外。

静态类成员函数不能由对象调用,只能用类名称加作用域解析操作符来访问。

此函数只能访问类的静态成员变量。

初始化非静态const成员变量,引用变量,必须用成员初始化列表(只能用于构造函数)。

对于自身就是类对象的成员,成员初始化列表效率更高。