1.一个“高质量的库”是指这样的库:它以一个或几个方便、安全且高效的类的形式,给用户提供了一个概念。
安全意味着这个类在库的使用者与它的供方之间构成了一个特殊的类型安全的界面。
高效意味着与手工写出的C代码相比,这种库的使用不会给用户强加明显的运行时间或者空间上的额外开销。
2.C++是C程序设计语言的一个超集,提供了C所提供的各种功能。还为定义新类型提供了灵活而高效的功能。
程序员可以通过定义新类型,使这些类型与应用中的概念紧密对应,从而把一个应用划分成许多容易管理的片段。这种程序构造技术通常被称为数据抽象。
某些用户定义类型的对象包含着类型信息,这种对象就可以方便而安全地用在那种对象类型无法在编译时确定的环境中。
使用这种类型的对象的程序通常被称为是基于对象的。如果用的好,可以产生出更短、更容易理解,而且也更容易管理的程序。
/*
面向对象的三大特点(封装,继承,多态)缺一不可。
通常“基于对象”是使用对象,但是无法利用现有的对象模板产生新的对象类型,继而产生新的对象,也就是说“基于对象”没有继承的特点。
而“多态”表示为父类类型的子类对象实例,没有了继承的概念也就无从谈论“多态”。
现在的很多流行技术都是基于对象的,它们使用一些封装好的对象,调用对象的方法,设置对象的属性。
但是它们无法让程序员派生新对象类型。他们只能使用现有对象的方法和属性。
所以当你判断一个新的技术是否是面向对象的时候,通常可以使用后两个特性来加以判断。
“面向对象”和“基于对象”都实现了“封装”的概念,但是面向对象实现了“继承和多态”,而“基于对象”没有实现这些,的确很饶口。
简单地说:基于对象不能继承,更谈不上多态.
*/
3.一个程序设计语言要服务于两个相互关联的目的:它要为程序员提供一种描述所需执行的动作的载体;还要为程序员提供一组概念,使他们能利用这些概念
去思考什么东西是能够做的。
4.C++与C:
1)在C++里几乎不需要用宏。用const或enum定义明显的常量,用inline避免函数调用的额外开销,用template去刻画一族函数或者类型,用namespace去避免名字冲突。
2)不要在你需要变量之前去声明它,以保证你能立即对它初始化。声明可以出现在能出现语句的所有位置上,可以出现在for语句的初始化部分,也可以出现在条件中。
3)不要用malloc()。new运算符能将同样的事情做得更好。对于realloc()请试一试vector()。
4)试着避免void*、指针算术、联合和强制,除了在某些函数或类的实现的深层之外。
在大部分情况下,强制都是设计错误的指示器。如果你必须使用某个显式的类型转换,请设法去用一个“新的强制”,设法写出一个描述你想做的事情的更精确的语句。
5)尽量少用数组和C风格的字符串,与传统的C风格相比,使用C++标准库string和vector常常可以简化程序设计。
4.什么是C++:
1)一个更好的C
2)支持数据抽象
3)支持面向对象的程序设计
4)支持通用型程序设计
5.模块设计。
EG:定义一个堆栈。
[1]为堆栈提供一个用户界面(例如,函数push()和pop())。
[2]保证堆栈的表示(例如,一个元素的数组)只能通过用户界面访问。
[3]保证堆栈在被使用前已经做了初始化。
C++提供了一种机制,可以把相关的数据、函数等组织到一个独立的名字空间里。
例如:模块Stack的用户界面可以按如下方式声明和使用。
namespace Stack{ //界面
void push(char);
char pop();
}
void f()
{
Stack::push('c');
if(Stack::pop()!='c')error("impossible");
}
Stack::限定词表妹push()和pop()是来自Stack名字空间,这些名字的其他使用不会与之干扰,不会引起混乱。
Stack的定义可以通过程序的另一个单独编译的部分提供:
namespace Stack{
const int max_size=200;
char v[max_size];
int top=0;
void push(char c){
//检查上溢并压入
}
char pop()
{
//检查下溢并弹出
}
}
用户代码完全被隔离于Stack的数据表示之外,隔离的方式是通过写出Stack::push()和Stack::pop()代码来实现。用户不必知道Stack是用数组实现的,这个事项方式
也是可以修改的,而不会影响用户的代码。
数据实际上只是人们希望“隐藏”起来的许多东西的一类,数据隐藏的概念很容易扩展到信息隐藏,也就是说,例如函数、类型等名字,也很容易做成一个模块里面局部的东西,
为此,C++允许把任何声明放到名字空间里。
6.异常处理
namespace Stack{ //界面
void push(char);
char pop();
class Overflow();//表示显示异常的类型
}
当检查到溢出之时,Stack::push()可以激活异常处理代码;也就是说,它“抛出一个Overflow异常”:
void Stack::push(char c)
{
if(top==max_size)
throw Overflow();
//压入c
}
7.用户定义类型
C++允许用户直接定义类型,这种类型的行为方式几乎与内部类型完全一样。这样的类型常常被称作抽象数据类型。有关抽象数据类型的一个更合理的定义应对要求一个数学的“抽象”描述。给出
一个这样的描述之后,我们这里所谓的类型就是那种真正抽象实体的一个具体实例。
现在的程序设计:确定你需要哪些类型,为每个类型提供完整的一组操作。
8.具体类型
构造函数将在建立这个类的对象时被调用,它处理初始化问题。如果该类一个对象出了其作用域,需要做某些清理时,就应该去声明构造函数的对应物—析构函数。
虚函数。
9.通用型程序设计
一个算法能以独立于其表示细节的方式表达,而如果这样做又是能负担的起的,不出现逻辑毛病,那就应该这么做:
确定你需要哪些算法,将它们参数化,使它们能够对各种各样的适当的类型和数据结构工作。
安全意味着这个类在库的使用者与它的供方之间构成了一个特殊的类型安全的界面。
高效意味着与手工写出的C代码相比,这种库的使用不会给用户强加明显的运行时间或者空间上的额外开销。
2.C++是C程序设计语言的一个超集,提供了C所提供的各种功能。还为定义新类型提供了灵活而高效的功能。
程序员可以通过定义新类型,使这些类型与应用中的概念紧密对应,从而把一个应用划分成许多容易管理的片段。这种程序构造技术通常被称为数据抽象。
某些用户定义类型的对象包含着类型信息,这种对象就可以方便而安全地用在那种对象类型无法在编译时确定的环境中。
使用这种类型的对象的程序通常被称为是基于对象的。如果用的好,可以产生出更短、更容易理解,而且也更容易管理的程序。
/*
面向对象的三大特点(封装,继承,多态)缺一不可。
通常“基于对象”是使用对象,但是无法利用现有的对象模板产生新的对象类型,继而产生新的对象,也就是说“基于对象”没有继承的特点。
而“多态”表示为父类类型的子类对象实例,没有了继承的概念也就无从谈论“多态”。
现在的很多流行技术都是基于对象的,它们使用一些封装好的对象,调用对象的方法,设置对象的属性。
但是它们无法让程序员派生新对象类型。他们只能使用现有对象的方法和属性。
所以当你判断一个新的技术是否是面向对象的时候,通常可以使用后两个特性来加以判断。
“面向对象”和“基于对象”都实现了“封装”的概念,但是面向对象实现了“继承和多态”,而“基于对象”没有实现这些,的确很饶口。
简单地说:基于对象不能继承,更谈不上多态.
*/
3.一个程序设计语言要服务于两个相互关联的目的:它要为程序员提供一种描述所需执行的动作的载体;还要为程序员提供一组概念,使他们能利用这些概念
去思考什么东西是能够做的。
4.C++与C:
1)在C++里几乎不需要用宏。用const或enum定义明显的常量,用inline避免函数调用的额外开销,用template去刻画一族函数或者类型,用namespace去避免名字冲突。
2)不要在你需要变量之前去声明它,以保证你能立即对它初始化。声明可以出现在能出现语句的所有位置上,可以出现在for语句的初始化部分,也可以出现在条件中。
3)不要用malloc()。new运算符能将同样的事情做得更好。对于realloc()请试一试vector()。
4)试着避免void*、指针算术、联合和强制,除了在某些函数或类的实现的深层之外。
在大部分情况下,强制都是设计错误的指示器。如果你必须使用某个显式的类型转换,请设法去用一个“新的强制”,设法写出一个描述你想做的事情的更精确的语句。
5)尽量少用数组和C风格的字符串,与传统的C风格相比,使用C++标准库string和vector常常可以简化程序设计。
4.什么是C++:
1)一个更好的C
2)支持数据抽象
3)支持面向对象的程序设计
4)支持通用型程序设计
5.模块设计。
EG:定义一个堆栈。
[1]为堆栈提供一个用户界面(例如,函数push()和pop())。
[2]保证堆栈的表示(例如,一个元素的数组)只能通过用户界面访问。
[3]保证堆栈在被使用前已经做了初始化。
C++提供了一种机制,可以把相关的数据、函数等组织到一个独立的名字空间里。
例如:模块Stack的用户界面可以按如下方式声明和使用。
namespace Stack{ //界面
void push(char);
char pop();
}
void f()
{
Stack::push('c');
if(Stack::pop()!='c')error("impossible");
}
Stack::限定词表妹push()和pop()是来自Stack名字空间,这些名字的其他使用不会与之干扰,不会引起混乱。
Stack的定义可以通过程序的另一个单独编译的部分提供:
namespace Stack{
const int max_size=200;
char v[max_size];
int top=0;
void push(char c){
//检查上溢并压入
}
char pop()
{
//检查下溢并弹出
}
}
用户代码完全被隔离于Stack的数据表示之外,隔离的方式是通过写出Stack::push()和Stack::pop()代码来实现。用户不必知道Stack是用数组实现的,这个事项方式
也是可以修改的,而不会影响用户的代码。
数据实际上只是人们希望“隐藏”起来的许多东西的一类,数据隐藏的概念很容易扩展到信息隐藏,也就是说,例如函数、类型等名字,也很容易做成一个模块里面局部的东西,
为此,C++允许把任何声明放到名字空间里。
6.异常处理
namespace Stack{ //界面
void push(char);
char pop();
class Overflow();//表示显示异常的类型
}
当检查到溢出之时,Stack::push()可以激活异常处理代码;也就是说,它“抛出一个Overflow异常”:
void Stack::push(char c)
{
if(top==max_size)
throw Overflow();
//压入c
}
7.用户定义类型
C++允许用户直接定义类型,这种类型的行为方式几乎与内部类型完全一样。这样的类型常常被称作抽象数据类型。有关抽象数据类型的一个更合理的定义应对要求一个数学的“抽象”描述。给出
一个这样的描述之后,我们这里所谓的类型就是那种真正抽象实体的一个具体实例。
现在的程序设计:确定你需要哪些类型,为每个类型提供完整的一组操作。
8.具体类型
构造函数将在建立这个类的对象时被调用,它处理初始化问题。如果该类一个对象出了其作用域,需要做某些清理时,就应该去声明构造函数的对应物—析构函数。
虚函数。
9.通用型程序设计
一个算法能以独立于其表示细节的方式表达,而如果这样做又是能负担的起的,不出现逻辑毛病,那就应该这么做:
确定你需要哪些算法,将它们参数化,使它们能够对各种各样的适当的类型和数据结构工作。