C++ 第二课
来源:互联网 发布:骑士vs勇士第五场数据 编辑:程序博客网 时间:2024/06/05 00:45
各位亲 有时间可以去看看我的 “金骏家居淘宝店” http://jinjun1688.taobao.com/shop/view_shop.htm?tracelog=twddp 买时说明在我的博客看到有优惠哦 还有意外礼品赠送 真正的程序员淘宝店
一、C++内存分配
C语言中通过malloc/calloc/realloc/ free 函数实现内存的分配和释放,C++除了对C的兼容以外,提供了new/delete运算符来实现内存的分配和释放。
如: int*p=(int* )malloc (sizeof(int));
*p=100;
free(p);
p=(int*)malloc(10*sizeof(int))
for(int i=0;i<10;i++)
p[j]=i;
free(p);
----------------------------------------------------------------------------------
int*p=new int;
*p=100;
delete p;
p=new int[10];
for(int i=0;i<10;i++)
p[i]=i;
delete[] p;
p=new int(100);
cout<<*p<<endl; //100
delete p;
二、引用
1.引用即别名
int a=10;
int& b=a;
cout<<b<<endl; //10
b++;
cout<<a<<endl; //11;
int& b; //error !
int& c=b; // int& c=a;
----------------------------------------
2.引用必须被初始化为与有效内存相关联
int& r=*new int;
delete &r;
3 引用型参数
1)通过引用型参数可以在函数中对实参变量进行修改
2)通过引用型参数可以避免参数传递过程中的数据拷贝
3)通过将参数定义为常引用防止在函数对参数的意外修改,同时还可以接受常量型实参
4)传递引用型参数实际上就是传递地址,引用必须与有效内存相关联,引用的本质就是指针
4引用型返回值
永远不要反悔局部变量的引用(因为局部变量在作用域符号{}后就被销毁了,数据存在不确定性),返回全局/静态/成员变量的引用是安全的
5.引用和指针
1)指针可以不初始化,其目标可在指针被初始化后随意改变,引用必须初始化,且一旦确定就不能引用其他目标。
int a, b;
int *p=&a;
p=&b;
int& r=a;
r=b;//把b值赋给a
2)可以定义指向指针的指针,但不能定义指向引用的指针
int a;
int* p=&a;
int **pp=&p;//ok
int & r=a;
int &* pr=&r;//error!
3)可以定义引用指针的引用,不能定义引用引用的引用
int a;
int* p=&a;
int*& rp=p; //ok
int& r=a;
int&& pt=r; //error!
4)可以定义指针数组,但不能定义引用数组,可以定义数组引用
int a,b,c;
int* parr[]={&a,&a,&c}; //ok
int& parr[]={a,b,c}; //error
------------------------------------------------------
int arr[]={1,2,3};
int (&rarr)[3]=arr;
int(*parr)[3]=&arr;
三、类型转换运算符
char c=‘a’;
int n=int(c);
1.静态类型转换
目标类型 变量名=static_cast<目标类型>(源类型变量名);
如:int n=static_cast<int>(c);
编译器做静态类型检查:在源类型和目标类型之间只要有一个方向上能做隐式转换,那么在两个方向上都能做静态转换。
2.动态类型转换
目标类型 变量名=dynamic_cast<目标类型>(源类型变量名);
主要用于具有多态特性的父子类指针/引用之间的转换。
3.常量类型转换
目标类型 变量名=const_cast<目标类型>(源类型变量名);
用于去除指针/引用上的常属性。
const int* p1;
int* p2=const_cast<int*>(p1);
double* p3=const_cast<double*>(*p1);//error
注意:试图通过const_cast修改一个常量的值,其后果是不确定的。
4.重解释类型转换
目标类型 变量名=reinterpret_cast<目标类型>(源类型变量名);
在任意类型的指针或引用之间转换,甚至可以再指针和整数之间转换。
-----------------------------------------------------------------------------------------------------------------------------------
建议:1)尽量少用宏,取而代之的是 const和enum以及inline
如: #define PAI 3.14;
const double PAI=3.14;
#define square(x) ((x)*(x))
inline double square (int x) {...}
2)变量随用随声明
3)不要用malloc用new
4)避免使用void* 、指针算数 、联合和强制类型转换
5)尽量少用C风格的字符串(char* 和char 数组),代之以 string对象
6)建立起面向对象的思想。
- 第二课 C语言
- C语言第二课
- Linux C第二课
- C语言第二课
- 第二课、C简介
- C语言第二课练习
- C初学者的第二课
- C 语言第二课----数据类型、常量、变量
- 小小君的C语言第二课
- 第二十四课 C API概述
- 第二十六课 从Lua调用C
- C语言第二课 数字的运算
- 二进制简单计算-c基础第二课
- 我的第二节C语言课
- 我的c语言第二课
- 【C语言探索之旅】 第二部分第二课:进击的指针,C语言的王牌!
- C语言探索之旅 | 第二部分第二课:进击的指针,C语言的王牌!
- 第二篇 C
- spring中装载多个配置文件的解决方法
- 国内开源缺陷管理系统PPM Bug v1.3发布
- 数组名与地址以及二维数组下标用法(c语言)
- Scheme学习汇总
- StringBuffer和StringBuilder的区别
- C++ 第二课
- altium 官方pcb库的下载方法
- 黑马程序员——异常总结(老师)
- 非递归中序遍历二叉树(图解)
- VC中__int64的用法
- JAVA中String、StringBuffer、StringBuilder区别
- 二分查找
- Cocos2d-x中的时间调度
- Vim 命令-快捷键 集合(Easy Version)