面向过程的C++

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
-------------------------------------------------
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值