2011年5月19日
面向过程的C++
--------------------------------------------------
一、C++是什么
C语言的超集
C++的语法兼容C语法
C++是一种面向对象的程序设计
C++程序的命名:.cpp .cxx
在C语言里的.so,.a在C++里可用
glibc库posix库
C语言的编译gcc
C++的编译g++ -o s **.cpp
[root@localhost CPP]# g++ -o s test.cpp
二、面向过程的C++
1.引用:&
int a=100;
int &b=a;//声明了一个引用变量b,指向a
cout<<"a="<<a<<" b="<<b<<endl;
a.是一种数据类型,声明一个引用变量b,指向a
[root@localhost CPP]# ./s
a=100 b=100
数据类型 &变量名=初始化变量;
b.引用是一个变量的别名
b和a共用存储空间,地址相同
cout<<"a="<<&a<<" b="<<&b<<endl;
[root@localhost CPP]# ./s
a=0xbfcb770c b=0xbfcb770c
引用变量在声明在声明时一定要初始化(值为变量,const常量)
引用在作为函数形参时可以不初始化
void abc(int &x)
{
}
c.引用具有专一性,生产上引用作为形参
void swap_pointer(int *x,int *y)
{
int t;
t=*x;
*x=*y;
*y=t;
}
void swap_sellv(int &x,int &y)
{
int t;
t=x;
x=y;
y=t;
}
int main(int argc,char **argv)
{
int a=100;
int b=200;
cout<<"before a= "<<a<<" b="<<b<<endl;
swap_pointer(&a,&b);
cout<<"after a= "<<a<<" b="<<b<<endl;
cout<<"before a= "<<a<<" b="<<b<<endl;
swap_sellv(a,b);
cout<<"after a= "<<a<<" b="<<b<<endl;
}
------------------------------------------
[root@localhost CPP]# ./s
before a= 100 b=200
after a= 200 b=100
before a= 200 b=100
after a= 100 b=200
结论:引用比指针安全(专一性),引用的空间复杂度小
2.头文件的变化
C:/usr/include stdio.h
C++:/usr/include/c++/4/1/1 cstdio
3.命名空间:using namespace std;
定义好的std 标准命名空间
自定义命名空间:namespace cpp_space
{
};
---------------------------------------------------
namespace cpp_space
{
int a1=100;
void abc()
{
cout<<"self define space"<<endl;
}
}
int main(int argc,char **argv)
{
cout<<"a1="<<a1<<endl;
}
-------------------------
test.cpp:13: error: 'a1' was not declared in this scope
错误原因是没有指定自定义的命名空间
::运算符来引用指定命名空间
cout<<"a1="<<cpp_space::a1<<endl;
[root@localhost CPP]# ./s
a1=100
-----------------------------------------------------
::是域名运算符,指定命名空间(变量,函数)
引用全局变量cpp_spacd::a1
引用数据成员,成员函数
4.内存管理
动态分配内存
void *calloc(size_t nmemb, size_t size);
void *malloc(size_t size);
void free(void *ptr);
void *realloc(void *ptr, size_t size);
堆:链式结构,大小与swap有关,多次使用malloc,产生内存碎片
new/delete 运算符
new:在heap里开辟空间
delete:回收空间
--------------------------
int *p_c=(int *)malloc(1024);
if(p_c==NULL)
{
fprintf(stderr,"heap memory failure/n");
exit(1);
}
*p_c=100;
cout<<"*p_c="<<*p_c<<endl;
cout<<"sizeof(p_c)="<<sizeof(p_c)<<endl;
free (p_c);
p_c=NULL;
------------------------------------
[root@localhost CPP]# ./s
*p_c=100
sizeof(p_c)=4
---------------------------------------------
用new声明一个int型的空间
int *p_cpp=new int;
*p_cpp=100;
cout<<"*p_cpp="<<*p_cpp<<endl;
cout<<"sizeof(p_cpp)="<<sizeof(p_cpp)<<endl;
delete p_cpp;//free空间
------------------------------------------------------
[root@localhost CPP]# ./s
*p_cpp=100
sizeof(p_cpp)=4
-----------------------------------------------------------
用new声明一维数组二维数组三维数组,并赋值,释放空间
char *p_cpp_1=new char[100];//声明一维数组
strncpy(p_cpp_1,"one",100*sizeof(char));//赋值
cout<<"p_cpp_1="<<p_cpp_1<<endl;
delete[] p_cpp_1;//解放
int (*arr_p_1)[5]=new int[3][5];//声明二维数组
arr_p_1[0][0]=100;
cout<<"arr_p_1[0][0]="<<arr_p_1[0][0]<<endl;
delete[] arr_p_1;
int (*arr_p_2)[4][5]=new int[3][4][5];//声明三维数组
arr_p_2[1][1][1]=200;
cout<<"arr_p_2[1][1][1]="<<arr_p_2[1][1][1]<<endl;
delete[] arr_p_2;
------------------------------------------------------------------
[root@localhost CPP]# ./s
p_cpp_1=one
arr_p_1[0][0]=100
arr_p_2[1][1][1]=200
-------------------------------------------------------------------
new/delete成对出现,在多线程进程会引入静态问题,重入性问题
5.输入输出iostream(流的分类)
标准输入输出流 I/O流
cout:标准输出流 |本质是对象,结构体变量iostream类型
cin:标准输入流 |
cerr:标准错误输出流 |
文件流
fstream
ifstream
ofstream
串流
strstream
istrstream
ostrstream
6.内联函数
带参数的宏,宏在编译时替换
带参数宏的目的:提高效率
C++关键字inline,在使用时不会大压栈,在预处理里替换
inline声明内联函数不一定能成功,函数里不能出现循环,switch语句
inline int abc(char *str)
{
cout<<str<<endl;
}
int main(int argc,char **argv)
{
abc("hello");
}
---------------------------------------------------------
[root@localhost CPP]# ./s
hello
--------------------------------------------------------
7.函数重载
"重入性"
定义:函数名相同,形参不同,与函数的返回值类型不同
参数的个数不同
个数相同,类型不同
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
注意类型不能太相近,参数个数相同,形参类型相近会产生二义性
int add(int a,int b)
{
return a+b;
}
int add(int a,int b,int c)
{
return a+b+c;
}
int main(int argc,char **argv)
{
cout<<"add(10,20)="<<add(10,20)<<endl;
cout<<"add(10,20,30)="<<add(10,20,30)<<endl;
}
------------------------------------------------------------
[root@localhost CPP]# ./s
add(10,20)=30
add(10,20,30)=60
--------------------------------------------------------
8.默认参数:在函数声明定义时,给函数形参赋初始值
规则:如果声明时有赋值,则定义时不能赋值
如果没有声明,只有定义可以赋值
顺序:赋值时从右向左,调用时左向右
int add(int a,int b=10)
{
return a+b;
}
int main(int argc,char **argv)
{
cout<<"add(10)="<<add(10)<<endl;
}
------------------------------------------------
[root@localhost CPP]# ./s
add(10)=20
-----------------------------------------------
9.数据类型 bool 逻辑类型,占一个字节
bool a=true;
bool b=false;
cout<<"a="<<a<<" b="<<b<<endl;
------------------------------------------------
[root@localhost CPP]# ./s
a=1 b=0
-------------------------------------------------