C++编程技术
C++STL程序员开发指南 笔记一
长寿梦 20100430
一、 C与C++的区别
C是一种简单的语言,它真正提供的只有宏、指针、结构、数组和函数。不管什么问题,C都依赖宏、指针、结构、数组和函数解决。
而C++是C的超集,除此,还有私有保护性成员、函数重载、缺省参数、构造和析构函数、自定义操作符、内联函数、引用、友元、模板、异常、命名空间等。
C++的核心,是类,即其面向对象的编程思想。
总结十点区别:
(1) 文件扩展名;
(2) 简化输入输出手段;
(3) 数据类型变量的声明;1.声明位置任意。2.struct
(4) 动态内存分配符new —delete;
delete [n] 指针名;若n小于定义单元数,实际上仍然释放完了所有内存空间。
(5) 引用类型;避免拷贝开销
(6) const 语义的扩展;
1. 一般常量
允许 const int i = 10;在后续的编译中被直接访问。例如
const int i = 10;
char t[i];//等效于char[10],在C中编译错误
2. 常指针和常引用-----常参数
多用作函数参数,表示所指对象不能更新。在参数的传递过程中不需要执行拷贝构造函数,提高执行效率。
3. 常成员函数(重点掌握哦)
<类型说明符><函数名>(<参数表>) const;
只有常函数才有资格操作常量或常对象,没有const关键字说明的成员函数不能操作常对象。
4. 常数据成员
只能通过构造函数的初始化列表来初始化。
(7) 指针声明类型与对象类型相一致
void * 可以指向任意类型,但是int * = (int *)(其他类型)
(8) Int和char不再等价
cout << sizeof('A') <<endl;//1
cout << sizeof(65)<<endl;//4
(9) 结构体类型的变化,封装函数
(10)数组和指针的技术不同
二 、C++存储技术
存储类型: extern static register
存取修饰符:const volatie(暂态性)
生存期: 局部 静态 全局
三、函数技术
1. 构造函数 (分配内存并且初始化)(并非没有返回值,返回的指向所定义的对象的指针,但不能传递)
a. 缺省构造函数
构造函数重载
初始化
a. 如果类存在继承关系,派生类必须在其初始化表里调用基类的构造函数。例如:
Class A
{A(int x)}
Class B:public A
{B(int x,int y)}
B::B(int x,int y):A(x)//在初始化表里调用A的构造函数
b. 类的const常量只能在初始化表里被初始化,因为它不能在函数体内用赋值的方式来初始化
c. 类的数据成员的初始化可以采用初始化表或函数体内赋值两种方式,这两种方式的效率不完全相同。非内部数据成员应采用第一种方式。
2. 析构函数
一个类中只能有一个析构函数;
虚拟析构函数,其目的在于采用动态联翩方式选择析构函数。
3. 成员初始化列表
赋值与初始赋值的区别?
赋值操作,是在执行阶段向固定存储单元的变量写入数值的操作,此后仍允许其他赋值函数修改其内容。
初始赋值,则是对const类的常数仅在编译时完成预留内存单元同事填入初值,此后不允许再改动。
所以不能在构造函数中使用赋值语句在运行阶段对常数或引用类型数据进行赋值。在C++中只有const和引用类型是要在编译时就要制定其初值的。
类只是抽象数据结构的描述,不分配内存,因此构造函数编译阶段不能完成赋初值工作。
总结:初始化表式专门为这两种数据类型准备的。
4.常成员函数总结
Const用来临时设定成员函数的操作特性,凡含有const保留字的成员函数统称为常数性成员函数,其在类中声明的格式有3种:
l 防止本函数误写参数变量的: 返回值类型 函数名(const 参数,const 参数)
l 防止本函数误写类对象的内全部的变量的:返回值类型 函数名(参数表)const
l 防止其他函数误写返回地址或引用的:const 返回值类型 函数名(参数表)
5.拷贝构造函数和赋值函数
如果不主动地编写拷贝构造函数和赋值函数,编译器默认以“位拷贝”的方式自动生成缺省。若类中还有指针变量,就隐含了错误。例如
a.m_a =”hello”;
b.m_b==”world”;
默认拷贝为:a.m_a = b.m_b;这将操作三个错误:
1. 内存泄露: b.m_b内存没有释放。
2.相互影响。a.m_a 变,b.m_b随
3.两次析构
拷贝构造函数和赋值函数的区别:
拷贝构造函数在创建对象时调用。
赋值函数只能被已经存在了的对象调用。比如:
String A(”hello”);
StringB(“world”);
String C=A;//拷贝,等效形式C(A);好的风格应该写成后者,以区别之。
C=B; //赋值
6.内联函数
在内联函数内部允许用循环语句和开关语句;
内联函数的定义必须出现在内联函数第一次被调用之前。
7.友元函数
Friend使非成员函数能够访问类的私有成员。
四、面向对象机制的实现
相比于C语言的函数,C++增加了重载,内联,const和virtual四种新机制。其中重载和内联既可以用于全局函数,又可以用于类成员函数。Const 和virtual仅能用于类的成员函数。
1. 类的继承技术
a . 单继承技术(树形结构)
基类的访问特性
|
类的继承特性
|
子类的访问特性
|
Public
Protected
Private
|
Public
|
Public
Protected
No access
|
Public
Protected
Private
|
Protected
|
Protected
Protected
No access
|
Public
Protected
Private
|
Private
|
Private
Private
No access
|
b. 多继承技术
使用作用运算符::来解决作用域冲突的问题。
2. 函数重载的技术。
所谓函数重载,是指同一个函数名可以对应多个函数的实现。
要求,参数个数不同或参数类型不同。
3. 多态
封装、继承、多态是面向对象程序设计的三大特征,封装是基础,继承是关键,多态是补充,而多态又必须存在于继承的环境之中。
所谓多态性,发出同样的消息被不同类型的对象接收时导致完全不同的行为。这里所说的消息主要是指对类的成员函数的调用,而不同的行为是指不同的实现。利用多态性,用户只需发送一般形式的信息,而所有的实现留给接收消息的实现者。
4. 纯虚函数和抽象类 技术
纯虚函数是一种特殊的虚函数,它的一般格式如下:
Class <类名> {virtual <类型><函数名>(参数表)=0}
把实现留给基类的派生类来做。
带用纯虚函数的类称为抽象类。抽象类不能定义对象。在实际中,为了强调一个类是抽象类,可将该类的构造函数说明为保护的访问控制权限。
抽象类的主要作用:将有关内容组织在一个继承层次结构中,由它来为它们提供一个 公共的根,相关的子类是从这个根类派生出来的 。抽象类刻画了一组子类操作接口的通用语义。
抽象类只能作为基类使用,其纯虚函数的实现由派生类给出。如果派生类没有重新定义春虚函数,而只是继承基类的纯虚函数,那么这个派生类仍然是一个抽象类,不能直接使用。