HelloWord描述数据,整个语句就是处理数据。
3、iostream
由两个基本的istream和ostream构成。
分别为输入流和输出流。
Stream流:
表示一个对象到另外一个对象的流动。
Cin对象:
处理标准输入,即键盘输入
Cout对象:
处理标准输出,即屏幕输出。
Cerr对象:
用于生成警告或错误消息。
Clog对象:
用于生成程序的执行信息。
“<<”:
插入符:
向流中插入数据;“>>”:
提取符:
向流中提取数据。
Cout<<、cin>>
Endl操纵符:
作用是输出换行符,并且刷新输出缓冲器。
4、输出格式控制
dec:
十进制表示数值数据
hex:
十六进制表示
oct:
八进制
endl:
插图换行
4、文件的读写
#包括ofstream和ifstream分别负责数据的输入和输出。
构造函数:
这个对象创建时所执行的函数。
注:
1、让代码变规范快捷键:
Ctrl+K、Ctrl+F
2、软件的debug版本(调试版本,需安装VisualC++才能运行)和release版本(发布版本,可以在没安装的VisualC++的计算机上正常运行)。
第三章:
c++世界众生相
1、数据类型
C++中可以分为基本数据类型和构造数据类型。
基本数据类型:
时c++中最基础的数据类型,不可再分。
如一个整数一个字符。
构造数据类型:
可以将多个基本数据类型组合起来,构造一个比较复杂的数据类型。
例如:
长发形数据结构
StructRect
{
Intm_Length;
intm_Width;
};
构造数据类型有:
1)数组类型2)结构类型3)联合类型4)枚举类型。
2、常量与变量
常量:
只能读取不能修改
变量:
既可读取也可修改
注:
在程序中常量可以直接使用而变量必须先声明在使用。
3、声明变量
格式:
数据类型变量名;(数据类型变量名1,变量名2;不推荐)
非法的变量声明:
1)不能使用关键字作为变量名例intcase;
2)变量名不能以数字开始例int1member;
3)变量名字中不能含空格例booldoyouloveme;
4)变量声明一般放在变量使用之前,一般放在函数体开始的部分。
4、变量命名
匈牙利命名法:
变量名=属性+类型+对象描述
命名规则:
1)简单易懂;
2)最短长度,最大信息量;
3)变量名由名词构成;
4)不要使用数字编号;
5)常量大写;
6)使用约定俗成的前缀、前加s_表示静态(static)变量;前加g_表示全局(global)变量;类的数据成员前加m_表示成员变量。
5.c++中的常量
主要包括整形常量、浮点型常量、字符常量、字符串常量。
6、转义字符
\a:
响铃计算机喇叭发声。
\n:
换行\r:
回车\t制表符
\\:
输出\本身\”:
输出双引号\’:
输出单引号
7、用宏和const关键字定义常量
#define宏名称宏值
宏名称用大写字母表示,宏值可以时一个常数、一个字符串。
甚至更复杂的语句。
例#definePI3.1415926
宏的本质时替代,预编译处理源代码时会用宏值代替宏。
const数据类型常量名=常量值;
由于常量的值不可修改所以在定义常量的同时完成它的赋值。
8、数值类型
1)整形:
int2个字节;shortint2个字节;longint4个字节;longlongint8个字节(应对64位下的开发);还可以用关键字unsigned和signed对整形数据进行修饰。
2)浮点型
单精度型:
float占4个字节;双精度型double占8个字节;长双精度型longdouble占10个字节。
3)布尔类型
bool占1个字节;boolbSuccess=ture;当表达式需要一个算数值时,布尔类型对象将被隐式的转换成int类型。
成为一个整形对象,取值false为0,ture为1.
●函数里不能定义函数。
4)字符类型
类型说明符char占一个字节;取值-128~127;
wchar_t占2个字节表示更大的范围字符。
5)字符串类型
表示一个字符串,用basic_string来表示。
实质是对一个字符数组的包装。
用0表示字符串的结束。
若包装的为char类型的数组,则字符串类型为string,时wchar_t类型的数组,则字符串类型就是wstring。
*防止程序一闪就关可以在末尾加:
cin.get();getch();system("pause");inti;cin>>i;
9、数组
声明一个数组的语法格式:
数据类型数组名[个数常量][个数常量]…;
数组初始化,可以完全赋值,可以部分赋值,也可以不赋值默认初始值。
intn=nSalary[24];
表示把nsalary数组中的第25个数据赋值给n。
下标是以0开始的,即[0]表示第一个元素。
一个长度为n的数组,其下标最大值是n-1.
floafa=fArray[1][1]l
表示访问fArray多维数组中的第2行第2列元素。
对于多维数组,c++按照维数从高到低的顺序来排列的。
在同一维按下标从低到高的顺序排列。
10、枚举类型
声明一个枚举类型的语法格式:
enum枚举类型名
{
1,
2,
.
.
n
};
枚举类型取值只能时枚举类型定义列出的某一个。
若定义枚举类型时没给枚举元素赋值,那么会有一个默认的初始值,0,1,2,3…,
如果想把某个变量的取值限定在某几个可选值的范围之内,则可以把这个变量声明为枚举类型。
枚举元素的数值是常量,不能再完成枚举类型的定义后再改变其中某个元素的值。
11、结构体
struct结构体名
{
数据类型1成员名1;
数据类型2成员名2;
。
。
。
数据类型n成员名n;
};
结构体变量实际上是结构体中多个成员变量的组合,它包含了结构体中的所有成员变量。
使用“.”运算符来引用一个结构体中的各个成员变量:
结构体变量.成员变量
12、指针
指针本质时一种表示内存地址的数据类型,与常用的int、float一样,只是指针表示的时内存地址,程序可以通过指针直接操作内存。
内存是跟程序打交道的主要硬件。
一个程序主要时通过读取内存中的数据参与运算,然后将结果数据在写会内存。
有两种途径可以访问内存。
一种是通过变量名间接访问。
先定义保存数据的变量,再通过变量名间接的访问内存中存放的数据。
;另外一种是直接通过地址,也就是通过指针来访问内存中的数据。
●1KB=1024Byte1Byte=8bit
存放在指针中的地址可能时一个对象的地址、一个整数的地址。
甚至是一个函数的地址。
如果指针变量保存的是一个对象或者函数的地址,就说这个指针指向这个对象或函数。
定义:
数据类型*变量名;
数据类型可以是基本数据类型,int,double等等,也可以是自定义的结构体复杂数据类型。
数据类型也称为指针的类型。
●编码规范:
一条语句只完成一件事情。
使用指针之前,必须对其进行赋值,将其指向某个有意义的数据或代码。
指针变量=内存地址;
&:
取地址运算符,放在一个变量前面,就得到该变量在内存中存放的地址。
*:
指针运算符或解析运算符,执行的是与&运算符相反的操作。
如果将其放在一个指针变量的前面,就可以取得这个指针所指向的内容。
无论内是数据还是程序代码。
->:
如果一个指针指向的是一个结构体类型的变量,可以直接使用–>运算符来访问这个结构体的成员变量。
对于一个变量,可以用取地址运算符&得到它的地址,然后赋给指针。
也可以使用一个指针对另一个指针进行赋值。
第四章将语句编织成程序
1、用运算符对数据进行运算
表达式由运算符、操作数、标点符号组成。
c=(a
a:
b比较a是否小于b,真则将a赋给c,否则b赋给c。
a、b、c是操作数,<,?
是操作符,()是标点符号。
1)、算数运算符
+-*/%,++i和i++
前置自增运算符先自增后置自增运算符后自增
软件开发中的重要经验:
使用前置自增运算符代替后置自增运算符。
2)、赋值操作符
=,+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=(二元运算符)
3)、关系运算符
>>=<<===!
=(二元运算符)
运算结果类型为bool型,若两个操作数关系符合运算符,则表达式结果为ture,反之为false。
注:
为了保证代码行为的一致性,不要在代码中使用关系运算符==比较两个浮点数是否相等。
三元元算符语法格式如下:
条件判断表达式?
ture表达式:
false表达式
最常见的应用是选出两个数中较大或较小的一个。
4)!
(非)、&&(与)、||(或)
!
作用是取反。
&&只有当两个操作数值都为ture时,结果才是ture。
||只要两个操作数有一个为ture,结果就为ture。
2、运算符的优先级
3,将表达式编织成语句
变量定义语句inta;
变量赋值语句a=20;
当连续的多个语句属于同一控制范畴时,用一对{}括起。
4,条件选择语句
1)if语句
if语句中的else部分可以省略;
if语句可以实现嵌套;
if语句可以并列;(若多个表达式分之都为ture则只执行第一个)
2)并列选择的switch语句
switch条件选择结构,应该注意的问题:
1)switch后的表达式是整形,或能够转化为整形的其他类型如字符型或枚举类型。
2)case之后必须是一个常量表达式。
不能是变量或带有变量的表达式。
3)各常量表达式值不同
5、循环语句
1)while
2)dowhile循环
与while循环的区别是dowhile首先执行一次循环体,再判断表达式的值,而while循环首先判断表达式的值在决定是否循环。
在某些循环至少完成一次的时候用dowhile更合适。
3)for循环
使用条件表示式时,确保表达式在循环结束时值为false若循环无论怎么执行,条件表达式值始终为ture时,会形成死循环。
for循环适合于拥有某个特定的循环范围的循环场景。
4)循环控制break和continue
break和continue都是在某种条件下跳出循环,但是两者又有本质差别:
break是跳出整个循环,立刻结束循环语句的执行,而continue只跳出本次循环,继续执行下一次的循环。
6、从语句到程序
顺序结构可以完成简单的一步步顺序执行的任务
选择结构可以根据不同条件作出决策,选择不同执行路径,实现不同的功能。
循环结构用于一些需要反复执行的语句,完成的功能需要多次重复实现。
正是依靠这三种控制结构将分散的语句串联起来,表达一定的运算逻辑,形成一个完整的程序。
第五章用函数封装程序功能
1、把一个程序装进箱子(封装)需要两步:
1)声明一个函数为了找到这个箱子,得给箱子贴上标签,这个标签就是c++中函数的声明。
声明函数的语法格式如下:
返回类型标识符函数名(形式参数表);
例定义一个加法函数
intAdd(inta,intb);
返回值类型为int,表示该函数计算结果的返回值返回给它的调用者。
如果函数只执行一些动作,无需返回值,则可以用void作为返回值的类型。
Add就是该函数的标签,变量命名重在说明它是什么,而函数命名重在说明它做什么。
形式参数表的语法格式:
数据类型1参数名1,数据类型子2参数名2.。
。
。
形式参数表要有明确的数据类型。
形式参数表中每个参数必须有明确的数据类型说明符。
形式参数可以有默认值。
这些默认参数必须位于形式参数表的末尾。
没有形参时可以用void代替或留空。
2)定义这个函数。
函数的定义紧接着函数的声明进行的,语法格式如下:
返回类型标识符函数名(形式参数表)
{
函数定义;
}
如:
intAdd(inta,intb)//声明
{
intnResult=a+b;//函数定义
returnnResult;//函数放回值
}
如果函数有返回值,需要用return将结果返回给函数调用者。
2、函数调用
通过下面的形式调用函数库或自己定义的函数:
返回值变量=函数名(参数);
例intnResult=Add(1,2);
实现了对Add函数的调用,函数执行完的返回值保存到nResult中。
函数调用的本质就是将一部分工作交给其他人完成。
主调函数与被调函数:
函数中调用的函数是被调函数,调用别的函数的函数是主调函数。
c++支持函数的嵌套调用,被调用者还可以作为做主调用者去调用其他函数。
嵌套调用的意义就是不断细化分解一个较大任务。
经常使用头文件来引入其他函数的声明,所以要想使用某个函数,就要先引用它所在的头文件。
对于自己定义的函数,必须在函数被调用之前进行声明。
否则,会产生这个函数找不到标识符的错误。
3、参数传递
通过实际参数和形式参数可以实现从函数外部向函数内部传递数据。
如intnResult=Add(1,2)
将实际参数1,2赋给函数Add()中的a,b参与运算。
4、返回值
函数调用表达式的值就是从函数箱子中取出的数据,这个数据个类型就是函数的返回值类型。
除了可以对变量赋值之外还可以使用函数调用表达式直接进行计算,将其应用在任何可以使用此类类型数值的地方。
5、内联函数
用体积来换取速度,省去了函数调用的过程。
编译时直接把函数的代码插入函数调用的位置。
内联函数的声明:
inline返回类型标识符函数名(形式参数表)
{
函数体语句;
}
内联函数使用规则:
要短小精悍,一般不要超过5行;
执行的时间要短;
inline关键字仅是一种建议。
6、重载函数
重载函数就是让一个函数承载多种功能,具有多种含义,就是让同一个函数名表示多种意义。
以统一的形式实现对不同数据的处理,就是函数重载的定义。
两个函数,因为实现的功能相似,所以取相同的的函数名,但是参数的个数或类型不同,这就是函数重载。
而这两个函数就被称为重载函数。
这些重载函数因为实现的功能相似,所以有相同的函数名,但是因为接受的输入参数不同,所以有不同的实现。
只要发现程序中有多个函数的意义相似,只是处理的数据不同,就可以使用重载函数。
编译器是通过函授的参数类型和个数来区分重载函数的不同版本的。
所以只有相互之间的参数类型或个数不同,才可以构成合法的重载函数。
如果两个函数仅仅是返回值类型不同,并不能构成重载。
在重载函数中应该尽量避免使用默认参数,让编译器能够准确无误的找到匹配的重载函数。
7、函数声明的设计规则
函数的声明也称为函数的接口。
在设计实现函数时,不仅要让函数功能正确,还要让接口清晰明了。
提高可读性。
1)使用动词+名词的形式给函数命名
函数是对功能的封装,功能往往表现为动作和相应的对象。
所以要使用动宾短语。
2)使用完整清晰的形式参数名,表达参数的含义。
例:
3)参数的顺序要合理
某些情况表示特定意义的参数的顺序已经具有了业界普遍的遵循的规则,如复制字符串:
要把目标字符串作为第一个参数,源字符串做第二个。
4)避免函数有太多参数
参数不要过多,应该控制在5个以内,确实需要很多,可以使用结构体。
5)使用合适的返回值。
8、函数体的设计规则
1)在函数体的入口处对参数的有效性进行检查。
如果需要对无效的参数进行处理,可以采用条件语句,根据参数的有效性对用户进行提示或直接返回函数执行失败信息等。
如果无需处理无效的参数,可以简单的使用断言(assert)来对参数有效性进行判断。
2)谨慎处理函数的返回值
如果函数有返回值,则不可返回一个指向函数体内部声明的局部对象的指针或引用。
因为这些局部对象会在函数执行结束时自动销毁,这些指针或引用所指向的数据变得无效,成为野指针。
3)函数的功能要单一
4)函数主体不宜太长
尽量控制在100行代码之内。
第六章当c++爱上面向对象
1。
结构化程序设计
从问题出发,逐步求精的开发方法称为结构化程序设计方法。
缺点:
数据和操作时相互分离的,如果数据格式变化,相应操作函数就要改写,遇到系统需要功能扩展,要修该大量功能函数。
2、面向对象程序设计
面向对象程序设计思想认为:
现实世界时由很多彼此相关并互通实体的对象组成的。
每个对象由两部分组成,描述对象状态或属性的数据和描述对象行为或功能的函数(方法)。
结构化程序设计思想将数据和函数分开,而面向对象程序设计思想将数据和函数结合共同构成对象准确的描述现实世界。
3、面向对象的三座基石:
封装、继承与多态
1)封装
对象就是封装这些数据和操作这些数据的算法的逻辑实体。
封住机制可以对数据加以保护。
2)继承
继承时可以让某个类型的对象获得另一个类型的对象的属性的方法。
3)多态
多态是指不同对象在不同的情况下具有不同的能力。
例如,求和操作,如果操作的数据时数就是两个数求和,如果操作的是字符串,则它是连接两个字符串。
“见人说人话,见鬼说鬼话”。
面向对象程序设计的优势:
1)容易设计和维护
2)复用程序和代码,程序质量高
3)容易扩展
利用继承、封装和多态的特性可以设计出高内聚、低耦合的系统结构。
4、类
面向对象思想将显示世界所有的物体都封装成对象,而类时所有相同对象的抽象,是他们总体的描述。
声明一个类的语法格式:
class类名:
public基类名
{
public:
//公有成员,通常用来定义类的行为,提供接口供外部访问
protected:
//保护型成员
private:
//私有成员,通常用来定义类的属性
};
通常用一个名词来描述这个类所代表的一类对象,后面试类的继承方式和基类名,若没有基类,这一部分可以省略。
类的主体中,会在public部分定义类的行为,提供公共的函数接口供外部访问;在protected部分,可以定义给遗传给下一代子类的属性和行为;在private定义这个类所私有的属性和行为。
一般的,我们只是将类的声明放在头文件(.h)中,在头文件中声明类的成员函数的行为的原型,成员函数的具体事项一般放在相应的源文件(.cpp)中。
类名和函数名之间加上域操作符表示PrepareLession()函数属于Teacher类的成员函数。
通过在一个类中,用函数描述对象的行为,用变量描述对象的属性,这就完整的声明了一个用于描述的某类对象的类。
为类设计友好的接口:
类的接口设计的好坏是衡量一个程序员水平的重要标准,要让接口设计的友好,应遵循下面设计原则:
1)简化的视图
只需要将必要的成员公有(public)就可以了,使用受保护的货私有的成员来向用户隐藏不必要的细节。
2)用户的词汇
从用户的角度出发,降低用户的学习曲线。
除了使用class关键字之外,还可以使用struct关键字。
二者非常相似,唯一区别就是,默认情况下class声明的类是私有的,而struct声明的类是公有的,无论使用哪个,我们都应该在声明中明确支出各个成员的访问级别,而不要依赖关键字的默认行为。
只有在类有很少的方法并且有公有数据时,才用struct关键字。
5、使用类创建对象
要得到类的具体对象,可以用定义变量的方式将类当成一种新的数据类型来创建变量:
类名对象名;
类名是已定义好的类的名字,对象名是要声明的对象标识符。
得到对象后,就可以调用这个类提供的公有成员函数,完成这个对象的行为。
使用‘.‘操作符来调用一个对象的成员函数:
对象名.公有成员
除了直接使用对象变量之外,跟普通的数据类型一样,还可以使用对象类型的指针来指向该对象,通过指针来访问该对象的成员。
除了使用&取地址得已知对象的地址,并用它对指针进行赋值之外,还可以使用new直接创建对象并返回该对象的地址。
再用这个地址对指针进行赋值。
同样可以创建新的对象并将指针指向这个新的对象。
Teacher*pMrchen=newTeacher();
有了对象指针,就可以利用->,访问对象成员。
值得注意的是,new创建的对象无法在结束其生命周期的时候自动销毁,必须使用delete关键字销毁,释放占用的内存。
类和对象的关系简单来讲:
多个对象的抽象是类,类的具体化是对象。
6、构造函数和析构函数
为类添加构造函数:
class类名
{
public:
类名(参数列表)
{
//对类进行构造,完成初始化工作
}
}
构造函数没有返回值;构造函数和类名相同;
通过带参数的构造函数,给对象名字属性:
TeacherMrChen(“chengliangqiao”);
使用初始化列表对对象初始化的语法格式:
class类名
{
public:
//使用初始化列表的构造函数
类名(参数列表)
:
属性1(初始值),属性2(初始值)//初始化列表
{
}
//类的其他声明和定义
};
*在可以的情况下,最好在构造函数的初始化列表中初始化类的所有成员属性。
析构函数:
它的名称是由类