C++笔记完美版适合初学者.docx
《C++笔记完美版适合初学者.docx》由会员分享,可在线阅读,更多相关《C++笔记完美版适合初学者.docx(22页珍藏版)》请在冰点文库上搜索。
C++笔记完美版适合初学者
C++笔记(day02)2007-3-23之阿布丰王创作
1、%ldd可行文件的名字;---可检查连接库
2、C++严格区分大小写,变量命名只能使用字母,数字,或下划线,第一个字母必须使用字母或下划线
3、float单精度,double双精度
sizeof(int)---返回int在内存中占的大小
size(bool)=1
size(char)=1
size(short)=2
size(int)=4
size(long)=4
size(float)=4
size(double)=8
无符号的数据一旦溢出,将成为0。
有符号的int最大值2147483647,益处变成最小值,负数
4、分歧数据间赋值:
有兼容性的,占空间小的数据类型,可以给占空间大的数据类型赋值
不兼容的,可能会造成数据丢失。
int->float可以转换;float->int小数部分丢失
5、运算符要求数据类型要相同
i++先用后加++i先加后用布尔运算符号:
结果真或假
逻辑运算符:
做bool运算!
(1)“与”运算&&,两条件要同时成立
(2)“或”运算||,只要有一个条件是真,就成立
6、按位与“&”有0则与的结果为0
按位或“|”有1则或的结果为1
按位异或“^”两位分歧则为1,相同为0
7、左移“<<"左移1相当于乘以2
右移“>>"右移1相当于除以2
8、三目运算符条件?
真:
假
9、返回变量---表达式可以再次赋值,赋值语句返回变量自己eg:
(a=10)=20
返回变量的值---不成再次赋值eg:
(a+5)=10
左值:
变量、赋值表达式,++i的返回值是左值
右值:
不克不及放在“=”左边的是右值,i++的返回值是右值
常量要在声明时就赋值,而且不克不及修改
10、流程控制
while(条件){循环体}条件成立,则进入循环,知道条件为假时,退出循环
(1)声明循环变量
(2)while()确定循环条件
(3)循环变量要有所变更,防止形成死循环
for(变量初始化;条件;变量的变更){循环体代码}
开始时判断循环条件是否成立,循环结束后,到第三个条件,使用变量改变
do{循环体}while(条件);
先执行一次,再判断条件,选择是否继续执行循环
break;跳出循环,执行循环之外的下一条语句
continue;从次处开始,结束本次循环,进行下一次循环
11、课堂练习---求1到100之间的所有素数
C++笔记(day03)2007-03-26
1、cin输入流一旦破坏,就不克不及恢复
2、函数:
一段相关代码组成的集合,以便完成一个特定的目的。
(1)可以通过名字来使用,曾强了代码的可重用性。
(2)提高可维护性。
3、函数定义=声明+函数体:
<返回类型>函数名(<参数表>...){
return...}
函数返回值:
只有在调用函数的同时才干保管返回值
函数定义时,小括号里的参数称为形参,在函数被调用的时候才有意义。
函数调用时,小括号里的被传入的参数称为实参。
4、函数在调用之前只有声明就可以,因为在编译阶段,参照声明可以完成语法上的检测。
函数声明<返回类型>函数名(<参数表>...);
声明与定义的分离,实现并行开发!
5、全局变量,局部变量
局部变量:
函数内部声明的变量,只能在它声明的函数内部使用。
如果没有对其初始化就使用,则其值为垃圾数字。
全局变量:
能被所有的函数共同使用,要声明在所有函数(包含main函数)之外。
尽量少使用,影响太大。
如果没有对其初始化就使用,系统默认为其初始化为0。
6、数据区:
只存放全局数据,数据区的数据是稳定的,程序启动时,即创建,程序结束时,才消失
堆区
代码区
栈区:
存储局部变量。
拔出数据从栈顶拔出,先进后出结构。
如果函数不调用的话,局部变量是不存在的
在main函数与其他函数之间有个标识表记标帜,一旦函数返回,栈顶下落到标识表记标帜处
栈中的数据是变更频繁的
函数调用时创建,函数返回即消失
7、值传递
函数调用其实不是传递实参自己,而是创建一个临时变量传到函数中
(1)为形参创建一个临时变量,临时变量的值是拷贝实参的值
(2)对形参的使用,实际上是对临时变量的使用,不会改变实参的大小
8、默认参数
(1)area(floata,floatb=10);当只传递一个参数时,形参b的位置默认为10
(2)有默认值的形参靠右摆放
9、内联函数
声明时加“inline”,运行效率高,不支持结构控制语句,必须先定义,不支持函数原形。
10、递归函数
在函数内部自己调用自己。
必须有明确的返回条件----递归的出口
11、函数重载
(1)函数名相同。
(2)参数表分歧(参数个数分歧,参数类型分歧,参数顺序分歧)。
(3)与参数名和返回类型不关
调用时会根据参数表匹配自动调用相应的函数
编译之后,函数的名字都会发生改变,后面会加上形参缩写作为后缀,没有任何函数的名字是一样的
不会做自动类型提升
对重载的函数最好不使用参数默认值
12、const
在函数内部不允许修改此形参
13、需求分析、设计、代码实现
多文件示例:
=========================================
chang.h
=========================================
charchange(char);
=========================================
chang_impl.cc
=========================================
charchange(charc){
if(c>=97&&c<=122){
returnc-32;
}elseif(c>=65&&c<=90){
returnc+32;
}else{
returnc;
}
}
=========================================
main.cc
=========================================
#include
#include"change.h"
usingnamespacestd;
intmain(){
charc='0';
while
(1){
cout<<"enterachar[0exit]>";
cin>>c;
if(c=='0'){
break;
}
cout<<"====>"<}
return0;
}
===========================================
14、外部变量和内部变量
外部变量:
externintg;----声明外部变量,引入一个变量,在此外源程序中声明
内部变量:
在源文件中声明的变量
外部变量肯定是一个全局变量!
作用域生命周期存储位置
全局变量(外部变量)所有函数程序启动->程序结束数据区Data
局部变量函数内部函数开始调用->函数返回栈Stack
静态局部函数中第一次调用函数时(只被初始化一次)->程序结束数据区---只需要一份数据,而且不希望此外函数访问他
静态全局根源文件中程序开始->程序结束数据区
作业:
实现银行业务=========a.cc==================
longid;
intpassword;
doublebalance;
long(id)create(balance,password);//创建账户
voidsave(sum);
int(staus0,-1)withdraw(sum,password);
floatquery();
===================================
generatorId();//得到唯一的ID号
intshowMenu();//现实主菜单
saveMenu();//收集开户信息,然后调用创建账户
createMenu();
withdrawMenu();
queryMenu();
===================================
***今日重点:
(1)形参和实参的区别
(2)递归
(3)函数重载
练习:
观察费波拉切数列1,1,2,3,5,8,13,21,34......第一项和第二项都是1,后面的每一项是前面相邻两项的和。
使用递归方法计算第n项的费波拉切数列结果。
C++笔记2007-03-27
1、程序由函数组成,函数只完成自己特定的功能即可
把函数声明写在头文件里(想使用函数时,可直接导入头文件,调用函数),把函数实现写在".cc"文件中
把多个".cc"文件编译成可执行文件->分别编译成".o"文件,再连接到一起
2、值传递
函数中的参数传递是值传递,形参只是实参的一份拷贝数据,在函数中改变形参的值,对实参无影响
3、作业分析:
显示层(与用户的交互)
操纵数据(完成业务逻辑)biz层
数据(id,password,balance)
Bank实现代码
================================================================
biz.cc
================================================================
//operation
/*p:
Passwordofaccount.
*b:
balanceofaccount.
*return:
idofaccount.
*/
longcreate(intp,doubleb);
voidsave(doublesum);
/*
*return:
0success,otherwise-1returned.
*/
intwithdraw(intp,doublesum);
doublequery(intp);
longgenerateId();
================================================================
biz.cc
================================================================
staticlongid;
staticintpasswd;
staticdoublebalance;
#include
usingnamespacestd;
longgenerateId(){
staticintid=1;
returnid++;
}
longcreate(intp,doubleb){
id=generateId();
passwd=p;
balance=b;
returnid;
}
voidsave(doublesum){
balance+=sum;
}
intwithdraw(intp,doublesum){
if(p!
=passwd){
cout<<"invalidpassword."<return-1;
}
if(balance<(sum+10)){
cout<<"noenoughmoney."<return-1;
}
balance-=sum;
return0;
}
doublequery(intp){
if(p!
=passwd){
cout<<"invalidpassword"<return-1;
}else{
returnbalance;
}
}
================================================================
menu.h
================================================================
intshowMenu();
voidcreateMenu();
voidsaveMenu();
voidwithdrawMenu();
voidqueryMenu();
================================================================
menu.cc
================================================================
#include"biz.h"
#include
usingnamespacestd;
intshowMenu(){
cout<<"create------>1"<cout<<"save------>2"<cout<<"withdraw---->3"<cout<<"query------->4"<cout<<"exit-------->0"<cout<<"enteryourchoice>";
intc;
cin>>c;
if(!
cin){
return-1;
}else{
returnc;
}
}
voidcreateMenu(){
intpasswd;
doublebalance;
cout<<"\tenterpassword>";
cin>>passwd;
cout<<"\tenterbalance>";
cin>>balance;
longid=create(passwd,balance);
cout<<"======================"<cout<<"createaccountok,id="<cout<<"======================"<}
voidsaveMenu(){
doublesum;
cout<<"\tentersum>";
cin>>sum;
save(sum);
cout<<"======================"<cout<<"savemoneyok"<cout<<"======================"<}
voidwithdrawMenu(){
intpasswd;
doublesum;
cout<<"\tenterpassword>";
cin>>passwd;
cout<<"\tentersum>";
cin>>sum;
intret=withdraw(passwd,sum);
if(ret==0){
cout<<"========================"<cout<<"withdrawsuccessful."<cout<<"========================"<}
}
voidqueryMenu(){
intpasswd;
cout<<"\tenterpassword>";
cin>>passwd;
doubleret=query(passwd);
if(ret!
=-1){
cout<<"============================"<cout<<"BLANCE:
$"<cout<<"============================"<}else{
cout<<"============================"<cout<<"invalidpassword"<cout<<"============================"<}
}
================================================================
main.cc
================================================================
#include
#include"menu.h"
usingnamespacestd;
intmain(){
intc=0;
do{
c=showMenu();
if(c==-1){break;}
switch(c){
case1:
createMenu();
break;
case2:
saveMenu();
break;
case3:
withdrawMenu();
break;
case4:
queryMenu();
break;
case0:
cout<<"===================="<cout<<"GoodBye"<cout<<"===================="<break;
default:
cout<<"===================="<cout<<"invalidoption,tryagain.";
cout<cout<<"===================="<break;
}
}while(c!
=0);
return0;
}
================================================================
4、数组
(1)声明数组<元素类型>数组名[元素个数]intintArray[100];-->intArray是个集合,有100个元素,每个元素都是int类型的
(2)初始化数组
(3)使用通过数组的下标来访问数组中的元素,下标从0开始intArray[0]=100;-->intArray数组中的第一个元素赋值为100
数组声明时,元素个数必须是常量表达式
数组声明带有初始化,则可直接为数组赋值
在数组声明时,必须指明数组长度,若在声明时候初始化,数组长度可省
inta1[2]={100,200};长度2
inta2[]={5,6,7};长度3
对于数组中的元素个数,比声明时的多,则会报错,这样的越界访问,对整个程序来说会有很严重的后果!
!
!
比声明少,系统会把余下的没有定义数据的元素初始化为0
不初始化的数组,其中的元素数据为随机数
下标工作的原理:
暗示编号,还暗示当前元素相对于数组起始位置的偏移量
计算机通过偏移量找到元素在内存中的位置
5、数组的排序
选择排序:
找出最小的放在第一个位置
数组元素有n个,需要找n-1次,需要比较n-i次(i为开始元素的位置)
6、多维数组
二维数组;一个数组中的每个元素是个数组
声明:
intiA[5][10];-->“5”代表数组有5行,“10”代表数组有10列
声明时,第一维可以省略!
确定一个元素需要2个下标
7、结构
用户自己定义的一组数据类型
声明结构时,编译器不会分配空间,在声明一个结构的变量的时候才会为其分配空间
结构中的成员是多个简单类型组成的
用“结构名.成员名”来操纵其中的成员变量
strcpy(p.name,"huxz");为char数组赋值
结构类型的变量间也可以相互赋值
结构的大小就是所有成员的大小之和(每个成员的大小必须是int类型的整倍数,当不敷时,会自动补齐)
Unix上还要求,结构的大小是结构的最大的成员的整倍数
size(of)计算结构大小
作业:
把银行系统用结构改写,要求可以开多个账户(定义一个account类型的数组保管)
structaccount{
longid;
intpassword;
doublebalance;
}
create(intpassword,doublebalance);
voidsave(intid,doublesum);
intwithdraw(intid,intpassword,doublesun);
doublequery(intid,intpassword);
C++笔记2007年3月28日
1、变量的存储
(1)内存是一块空间,把其中的每个字节做了编号,为了以后计算机能通过编号找到数据
(2)编址方式:
绝对编址(在整个程序中使用),相对编址(字节相对于逻辑0偏移量,在进程中使用)
2、取变量地址
(1)"&"&i暗示取内存中i的地址
地址的编址用十六进制暗示
(2)逻辑0在代码区
全局变量在数据区,地址的编址是大于0的
局部变量在栈区,地址的编址是小于0的
3、数组、结构的地址
(1)数组中的数据在内存中是连续存储的。
数组中每个元素的地址相差的值应为数组元素类型的大小。
(2)结构的地址:
结构的空间是连续的。
结构的起始地址与第一个成员变量的地址是一样的。
4、存储地址—
指针:
存储变量的地址
指针的类型由将要保管的地址的变量类型决定
int*只能保管int变量的地址
指针赋值一定要是同类型的指针才干相互赋值!
5、指针的运算
(1)指针和指针之间的运算
“+”,“*”,“/”指针与指针间是不克不及做这些运算,没有意义!
“-”可以做减法运算,以“sizeof(指针类型)”作为计算单位的!
注意:
要同类型的指针才干做此运算,分歧的话,会对运算单位发生歧义。
(2)指针和数字之间的运算(加、减都可以)
inti=100;
int*p=&i;
打印p+1->