Ch3 函数
1、内联函数:
inline 关键字只表示一个要求,不代表编译器一定将其作内联,同时,没有此关键字也可能被编译为内联, 内联函数要求比较简单。
2、带默认形参值的函数:
函数的定义也属于声明,故若一函数在定义之前有原型声明,默认形参值需在原型声明中给出,定义中不能出现。
有默认值的形参必须在形参列表最后。
3、函数重载:
形参必须不同。 防止二义性,如 int fun(int a,int b=1); 与 int fun(int a); 。
4、引用传递
Ch4 类与对象
1、面向对象程序设计的基本特点: 抽象、封装、继承、 多态。
2、构造函数和析构函数:
(1)构造函数:
构造函数的函数名与类名相同,而且没有返回值,通常被声明为公有函数。
调用时无需提供参数的称为默认构造函数。类中没有写,则会生成隐含的默认构造函数。
构造函数作为类的成员函数,可以直接访问类的所有数据成员,可以是内联函数,可以带有参数表,可以带默认的形参值,也可以重载。
(2)复制构造函数 :
复制构造函数的调用:
用一个对象初始化另一对象; 函数的形参是类的对象,调用函数进行形参和实参结合时 ; 返回值为类的对象,返回调用值时;
当类的数据成员中有指针类型时,默认复制构造函数为浅复制。
(3)析构函数:
析构函数在对象生存期即将结束时自动调用。 析构函数无返回值,不接受任何参数。 系统会自动生成隐含析构函数。
3、类的组合:
当创建类的对象时,各个内嵌对象成员首先被自动创建。
构造函数调用顺序:
(1)调用内嵌对象构造函数,调用顺序按照内嵌对象在组合类的声明中出现的次序。
(2)执行本类的构造函数
析构函数调用顺序刚好相反。
eg.
1. 若 PAT 是一个类,则程序运行时,语句“PAT (*ad)[3];”调用 PAT 的构造函数的次数是 0
Ch5数据的共享与保护
1、类的静态成员
(1)静态数据成员:
可以通过类名进行访问,“类名::标识符”。 初始化在类外进行。
(2)静态函数成员:
可以通过类名或对象名调用。可直接访问该类的静态数据和函数成员 访问非静态成员必须通过对象名。
2、类的友元
(1)友元函数:
在函数体中可以通过对象名访问类的私有和保护成员。
(2)友元类:
3、共享数据的保护
(1)常对象:
常对象必须进行初始化,而且不能被更新。通过常对象只能调用常成员函数。
(2)常成员函数:
常成员函数目的对象都被视为常对象。
(3)常数据成员:
构造函数只能通过初始化列表对该数据成员进行初始化。
静态常数据成员在类外说明和初始化。
(const int a; static const int b; }; const int A::b=10; A::A( int i):a(i){ } )
**类的静态常量如果具有整数类型或枚举类型,可直接在类定义中指定常量值。如static const int b=10;
(4)常引用:
常引用可以绑定到常对象。绑定对象都被视为常对象。
传递常引用耗时短。
eg.
1. 友元的作用是 D
A.提高程序的运用效率
B.加强类的封装性
C.实现数据的隐藏性
D.增加成员函数的种类
2. 下列说明中 const char* ptr,ptr应该是 A
A. 指向字符常量的指针 B. 指向字符的常量指针
C. 指向字符串常量的指针 char *p="hello"; D. 指向字符串的常量指针 const char *p="hello";
Bjarne在他的The C++ Programming Language里面给出过一个助记的方法: 把一个声明从右向左读。
char * const cp; ( * 读成 pointer to )
cp is a const pointer to char --->cp是一个指向字符char的固定指针
const char * ptr;
ptr is a pointer to const char; --->ptr是一个指向固定字符char的指针
3.设文件 f.cpp 中的一个函数要访问在另一个文件中定义的 int 型变量 x,则在 f.cpp 中 x 应
定义为______________。
位操作:
http://blog.csdn.net/morewindows/article/details/7354571
Ch6数组、指针与字符串
1、对象数组
当各元素对象的初值要求为不同的值时,需要定义带形参(无默认值的)构造函数。
2、指针
*(p-n)=p[-n]
空指针:int *p; p=0; 或 int*p=NULL;
void f(int p[])等价void f(int p[4])等价void f(int *p)
指针数组:如 int *p[3]
(1)指针型函数:返回值为指针,如 int *f(int a)
(2)指向函数的指针:如 void (*fun)(double)
(3)对象指针:如 Point *p; Point p1; p=&p1;
指向数据成员的指针 如:int Point::*ptr1=&Point::pA
指向函数成员的指针 如:int (Point::*ptr2)(int a,int b)=&Point::fun
访问数据成员 如:Point.*ptr1 或 p->*ptr1
调用成员函数 如:(Point.*ptr2)(int a,int b) 或 (p->*ptr2)(int a,int b)
指向类的静态成员 如: int *ptr=&Point:::count void (*fun)()=Point::show()
this指针
3、动态内存分配
int *poi=new int(2) 动态分配了用于存放int类型数据的内存空间,将2存入该空间并将首地址赋给poi,
()用0初始化
一个new一个delete
Point *ptr=new Point delete ptr Point (*ptr)[3]=new Point[2] [3] delete[] ptr
深复制
vector创建数组对象
迭代器
4、string类
getline(cin,s1,',')以,为分隔符读入一行
eg.
1. 假设整型数 i 的地址为 0x1234567,指针 ip 地址为 0x2185004,则执行以下语句后,k的值为 100
int i=100; int *ip=&i; int k=*ip;
Ch7继承与派生
默认私有继承
派生类继承基类中除构造和析构函数以外的所有成员。
保护继承中,基类的公有成员和私有成员都以保护成员的身份出现在派生类中,而基类的私有成员不可访问。派生类的其他成员可以直接访问从基类继承来的公有和保护成员,但是类外部通过派生类的对象无法访问它们,无论派生类的成员还是派生类的对象,都无法访问基类的私有成员
派生类名::派生类名(参数总表):基类名1(参数表1)....基类名n(参数名n),内嵌子对象1(参数表1)....内嵌子对象n(参数表n)
构造函数的初始化顺序并不以上面的顺序进行,而是根据声明的顺序初始化
类型兼容规则
using Base1::fun();
虚基类
直接或间接继承虚基类的所有派生类,都必须在构造函数的成员初始化列表中列出对虚基类的初始化。
3. 对于虚函数的调用(D) A、 一定使用动态联编 B、 一定使用静态联编 C、 必须使用动态联编 D、 不一定使用动态联编
解析:虚函数只是实现动态联编的必要条件之一,只有在同时满足下面条件时,对虚函数的调用才是动态联编:
(1) 类之间为基类和派生类关系 (2)要有虚函数
(3) 调用虚函数操作的是对象的指针或者对象引用,或者是由成员函数调用虚函数。
如果不能同时满足以上条件,对虚函数的调用将采取静态联编。
Ch8多态性
1、运算符重载
类属关系运算符“.“、成员指针运算符”.*“、作用域分辨符”::“和三目运算符”?:“不可重载。
运算符可重载为类的非静态成员函数和重载为非成员函数。
2、虚函数