002函数及重定向及字符串Word格式.docx
《002函数及重定向及字符串Word格式.docx》由会员分享,可在线阅读,更多相关《002函数及重定向及字符串Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
在声明引用时,必须同时进行初始化
void类型、数组、指针、引用等不能建立引用
(3)引用主要有三种用途
-变量或对象的别名;
-引用作函数的参数;
-函数的引用类型返回值。
(4)举例
intstudentname;
int&
sn=studentname;
floatstudentscore=99;
float&
ss=studentscore;
ss=59;
●例:
引用作变量、对象别名
voidmain(void)
inti=5;
int&
j=i;
cout<
“i=”<
i<
endl;
“j=”<
j<
j=6;
cout<
k=j;
“k=”<
k<
k=7;
●引用作函数参数(对比)
编程,实现两个变量值的交换。
#include“iostream.h”
voidswap(int&
x,int&
y)
{intt;
t=x;
x=y;
y=t;
}
main()
{inta,b;
”请输入两个数:
\n”;
cin>
>
a>
b;
”你输入的两个数是:
”<
a<
””<
b<
swap(a,b);
”交换后的两个数是:
●函数返回值为引用类型
优点:
-函数返回的是所返回的变量或对象本身,而不需要建立临时的对象。
这样减少了程序运行的开销;
-如果一个函数返回的是一个引用类型,那么该函数可以被当作左值使用
inta[]={1,3,5,7,9};
index(int);
index
(2)<
“\t”<
a[2]<
index
(2)=25;
index(inti)
returna[i];
四、递归调用
1.递归调用:
就是子函数自己调用自己。
2.例:
求1+2+3+……+10的和。
求1*2*3*……*10的积。
五、函数重载
1.带缺省参数值的函数
C++允许实参个数与形参个数不同,方法是在说明函数原型时,为一个或多个形参指定缺省值。
如:
intadd(inta=5,intb=6,intc=7);
intadd(inta,intb=6,intc=7);
intadd(int,int,intc=7);
说明:
Ø
所有取缺省值的参数都必须在无缺省值的参数的右边。
intadd(inta=5,int,intc=7);
错
调用函数时,从左到右将实参与形参结合,某个参数省略,则其后的参数都要省略。
add(,,10);
intadd(inta=4,intb=7,intc=9);
add()<
intadd(inta,intb,intc)
returna+b+c;
voidFun(intx,inty=0)//参数y为缺省参数
cout<
intx=5,y=6;
Fun(x,y);
//参数y未缺省按y=6调用
Fun(x);
//参数y缺省按y=0调用
2.函数重载
所谓函数重载,就是指一组函数名同名,但参数可区分的函数。
参数可区包括参数类型可区分和参数个数可区分。
说明:
带缺省值参数的函数与函数重载一起使用时可能会产生二义性。
函数重载时最好不要使用缺省参数。
函数调用时,如果实参与形参类型不匹配,C++编译器会自动作类型转换,如果成功,就继续执行,但也可能产生不可识别的错误。
//求多个数的和
intadd(int,int);
intadd(int,int,int);
intadd(int,int,int,int);
inta,b,c,d;
“请输入四个数:
cin>
b>
c>
d;
‘+’<
‘=’<
add(a,b)<
c<
add(a,b,c)<
d<
intmax(intx,inty)
if(x>
y)returnx;
elsereturny;
floatmax(floatx,floaty)
intmax(intx,inty,intz)
{
intt;
if(t<
y)
t=y;
z)
t=z;
returnt;
intx=5,y=6,z=7,t2,t3;
floatu=5.5,v=6.6,w;
t2=max(x,y);
t2="
t2<
t3=max(x,y,z);
t3="
t3<
w=max(u,v);
w="
w<
六、内联函数
1.使用内联函数是为了消除函数调用时的系统开销,以提高运行速度。
在函数定义前冠以inline,该函数就被声明为了内联函数。
定义为内联函数的只适用于短小的子函数,如果子函数体过大,则不适于定义为内联函数。
内联函数在第一次被调用之关必须进行声明,否则编译器不会将它处理为内联函数。
//求任意圆面积。
inlinedoublecircle(double)//如果在声明区没有关键字inline即使后面定义函数是使用了inline编译时,系统不会把函数circle当作内联函数。
voidmain()
doubler,s;
“请输入圆半径:
r;
s=circle(r);
cout>
”圆的面积是:
”>
s>
inlinedoublecircle(doublex)
return3.14*x*x;
//判断输入的字符是否为数字字符
#include<
iostream>
usingnamespacestd;
inlineboolisnumber(char);
//此处无inline,则isnumber函数不会被解释为内联函数
intmain()
for(charc;
c&
&
c!
='
\n'
;
)
if(isnumber(c))cout<
"
youenteredadigit.\n"
elsecout<
youenteredanon-digit.\n"
inlineboolisnumber(charch)
returnch>
0'
&
ch<
9'
?
1:
0;
七、string串
1.自定义类型,空间长度任意,支持搜索、替换、插入、删除、求长度、判断空串等操作
定义:
初始化:
赋值方式,使用构造函数方式
2.begin()函数
格式:
begin();
功能:
返回一个指向字符串第一个元素的迭代器。
stringa=“abcdefg”;
*(a.begin()+2);
a.begin();
3.end()函数
end();
返回一个指向字符串末(最后一个元素的下一个)的迭代器。
*(a.end()-4)<
a.end()<
4.insert()
basic_string&
insert(size_typeindex,constbasic_string&
str);
在字符串的位置index插入字符串str,若index为0,则在第一个字符前插入
insert(size_typeindex,constchar*str);
insert(size_typeindex1,constbasic_string&
str,size_typeindex2,size_typenum);
在字符串的位置index1插入字符串str的子串(从index2开始,长num个字符)
insert(size_typeindex,constchar*str,size_typenum);
在字符串的位置index插入字符串str的num个字符
iteratorinsert(iteratori,constchar&
ch);
在迭代器i表示的位置前面插入一个字符ch
voidinsert(iteratori,size_typenum,constchar&
在迭代器i表示的位置前面插入num个字符ch的拷贝
insert(size_typeindex,size_typenum,charch);
在字符串的位置index插入num个字符ch的拷贝
5.replace()
第一种:
basic_string&
replace(size_typeindex,size_typenum,constbasic_string&
即:
replace(起始位置,被替换字符数量,替换字符的字串);
#include"
iostream.h"
string"
main()
stringa="
abcdefgh"
b="
SOSOSOSO"
a.replace(2,3,b);
//也可以写成a.replace(2,3,"
);
}
结果:
a串中的cde三个字符被替换成了SOSOSOSO,屏幕输出abSOSOSOSOfgh
第二种:
replace(size_typeindex1,size_typenum1,constbasic_string&
str,size_typeindex2,size_typenum2);
replace(起始位置,被替换字符数量,替换字符的字串,字串的起始位置,字符数量);
这个方法是用“替换字符的字串”的一部分去替换“被替换字符”。
a.replace(2,3,b,3,4);
//也可以写成a.replace(2,3,"
3,4);
用了字串"
从第三个字符开始的后面四个字符,即OSOS替换a串中的从第二个字符开始后的三个字符
屏幕输出abOSOSfgh
第三种:
replace(size_typeindex,size_typenum,constchar*str);
replace(起始位置,被替换字符数量,替换字符的字串指针);
char*b="
用字符串指针b所指向的字符串替换a串中第二个字符后面的三个字符,屏幕输出abSOSOSOSOfgh
第四种:
replace(size_typeindex,size_typenum1,constchar*str,size_typenum2);
replace(起始位置,被替换字符数量,替换字符的字串指针,字符数量);
a.replace(2,3,b,2);
用字符串指针b所指向的字符串的前两个字符替换a串中第二个字符后面的三个字符,屏幕输出abSOfgh
第五种:
replace(size_typeindex,size_typenum1,size_typenum2,charch);
replace(起始位置,被替换字符数量,替换字符数量,替换字符);
charb='
W'
a.replace(2,3,9,b);
//也可以写成a.replace(2,3,9,'
用9个W替换a串第二个字符后的三个字符,屏幕显示:
abWWWWWWWWWfgh
6.find()
语法:
size_typefind(constbasic_string&
str,size_typeindex);
//第二个参数为可选项,如果不选,则从第一个字符开始查找
返回str在字符串中第一次出现的位置(从index开始查找)。
如果没找到则返回string:
:
npos。
String:
npos值为-1.
size_typefind(constchar*str,size_typeindex);
//第二个参数为可选项
size_typefind(constchar*str,size_typeindex,size_typelength);
返回str在字符串中第一次出现的位置(从index开始查找,长度为length,length是指str取前length个字符)。
如果没找到就返回string:
npos
size_typefind(charch,size_typeindex);
返回字符ch在字符串中第一次出现的位置(从index开始查找)。
npos
7.length()/size()
size_typelength();
length()/size()函数返回字符串的长度.
8.erase()
iteratorerase(iteratorpos);
删除pos指向的字符,返回指向下一个字符的迭代器
iteratorerase(iteratorstart,iteratorend);
删除从start到end的所有字符,返回一个迭代器,指向被删除的最后一个字符的下一个位置
erase(size_typeindex=0,size_typenum=npos);
//参数index和num有默认值,这意味着erase()可以这样调用:
只带有index以删除index后的所有字符,或者不带有任何参数以删除所有字符.
删除从index索引开始的num个字符,返回*this
例如:
strings("
So,youlikedonuts,eh?
Well,haveallthedonutsintheworld!
Theoriginalstringis'
s<
'
s.erase(50,14);
Nowthestringis'
s.erase(24);
s.erase();
cout<
9.empty()
boolempty();
如果字符串为空则empty()返回真(true),否则返回假(false).
10.substr
basic_stringsubstr(size_typeindex,size_typenum=npos);
substr()返回本字符串的一个子串,从index开始,长num个字符。
如果没有指定,将是默认值string:
这样,substr()函数将简单的返回从index开始的剩余的字符串。
algorithm"
stringa,s1="
Hello"
strings2="
123"
a=s1;
(a==s1?
not"
)<
equal\n"
a+s2<
reverse(a.begin(),a.end());
a="
abcdefghijklmn"
//空间长度任意
a.insert(a.begin()+2,'
P'
//插入字符
a.replace(4,1,9,'
M'
//替换
(s1.find("
ell"
)!
=-1?
found\n"
//搜索
(s1.find('
c'
intn=a.length();
//求长度
n<
a.erase(5,9);
//删除
a.erase(5);
a.empty()<
//判断空
11.append()在字符串尾添加字符串
12.push_back()在字符串尾添加字符
13.swap()交换字符串
14.clear()清空字符串
15.assign()为字符串赋值
八、main()函数与重定向
1.什么是重定向
改变从标准输入设备获取数据和向标准输出设备输出数据的默认方式。
2.命令行重定向
使用重定向符,输入符<
,输出符>
。
从文件中获取数据:
程序名<
文件名
向文件输出数据:
程序名>
例:
inta,b;
while(cin>
b)
a+b<
如果此文件保存为file1,在命令行上输入file1<
data.txt,即是从data.txt文件(已经存在)中读取数据,如果在命令行上输入file1<
data.txt>
result.txt即是从data.txt中读取数据,然后把结果输出到result.txt中。
3.利用main函数参数重定向
main函数的参数用于接收系统传递的数据。
main(intargc,char**agrv)——argc:
参数数量;
argv:
指向数组的指针
intmain(intargc,char**argv)
for(inti=0;
i<
argc;
++i)
argv[i]<
intmain(intargc,char**a