c++ 02
一、堆内存的动态分配与释放
malloc/calloc/realloc/free
new/delete:详见memory.cpp
1.通过new运算符分配单个变量
数据类型* 指针变量 = new 数据类型(初值);
2.通过new运算符分配数组
数据类型* 指针变量 = new 数据类型[数组长度] {元素初值, ...};
3.对于单个变量用delete销毁,而对于数组用delete[]销毁
4.定位分配
数据类型* 指针变量 = new(起始地址) 数据类型(初值);
起始地址所标记的内存应该事先分配好。
5.new在分配内存(malloc)之后还会调用构造函数,delete/delete[]在释放内存(free)之前先调用析构函数。
二、引用
1.引用即别名
int a = 10;
int& r = a; // r是a的一个别名
r = 20;
cout << a << endl; // ? 20
2.引用必须初始化
int& r; // ERROR !
3.引用一旦初始化,就不能再引用其它变量
int a = 10;
int& r = a;
int b = 20;
r = b; // b -> a
4.引用型参数和返回值
void foo (int a) { a = 100; }
void bar (int* a) { *a = 100; }
void hum (int& a) { a = 100; }
void print (const int& a) {
cout << a;
a = 100; // ERROR !
++a; // ERROR !
}
int b = 0;
foo (b); // b : 0
bar (&b); // b : 100
hum (b); // b : 100
print (b);
1)希望在函数中修改实参的值。
2)避免值传递所带来的开销。
3)为了防止在函数中意外地修改实参的值,可以使用const型的引用。
int* a (char);
int (*a) (char);
int (*a[5]) (char);
4)const型的引用可以接受具有const属性的实参。
5)引用型返回值常用于实现从函数返回左值的场合。
6)不可以从函数中返回局部变量的引用,就如同不可以从函数中返回指向局部变量的指针一样。可以返回全局变量、静态变量、成员变量、引用型参数本身、堆变量的引用。
5.引用和指针
1)引用的本质就是指针,引用不是实体变量。
2)指针可以不初始化,但是引用必须初始化。
int a;
int* p;
p = &a;
int& r = a;
3)指针的目标可以修改,但是引用的目标不可修改。
int a, b;
int* p = &a;
p = &b;
int& r = a;
4)可以定义指向指针的指针,但是不能定义引用引用的引用。
int* p;
int** pp = &p;
int& r = a;
int&& rr = r; // ERROR !
5)可以定义引用指针的引用,但是不能定义指向引用的指针。
int* p;
int*& rp = p;
int a;
int& r = a;
int&* pr = &r; // ERROR !
6)可以定义指针数组,但是不能定义引用数组。可以定义数组引用。
int a, b, c;
int* parr[] = {&a, &b, &c};
int& rarr[] = {a, b, c}; // ERROR !
int arr[] = {1, 2, 3};
int (&arrr)[3] = arr;
三、显示类型转换
C:目标类型变量 = (目标类型)源类型变量;
int n;
char c;
c = (char)n;
C++:五种转换形式
1.C风格的另一种写法
目标类型变量 = 目标类型 (源类型变量);
int n;
char c;
c = char (n);
2.静态类型转换:static_cast<目标类型>
int n;
char c;
c = static_cast<char> (n);
在源类型和目标类型之间至少在一个方向上可以隐式转换。
1)类型的相容性
double/char*
int* pn;
void* pv = pn;
int* pi = static_cast<int*> (pv);
2)自定义类型转换(单参构造、类型转换操作符)
3.动态类型转换:dynamic_cast<目标类型>
应用具有多态性的父子类的指针或引用之间。
4.常量类型转换:const_cast<目标类型>
去除常量型指针或者引用的常属性。
int a = 10;
const int* p = &a;
*p = 20; // ERROR !
int* q = p; // ERROR !
int* q = const_cast<int*> (p); // 去常
const int b = 10;
b = 20; // ERROR !
b++; // ERROR !
5.重解释类型转换:reinterpret_cast<目标类型>
应用于在不相关的指针或者引用之间,以及指针和整数之间,进行类型转换。
struct Student { ... };
Student s = { ... };
char* p = reinterpret_cast<char*> (&s);
int n = reinterpret_cast<int> (p);
四、C++之父的建议
1.在C++中尽量不用宏,代之以const、enum或inline。
#define PAI 3.1415926
const double PAI = 3.1415936;
#define ERROR_FILE -1
#define ERROR_MEM -2
enum ERROR {
ERROR_FILE = -1,
ERROR_MEM = -2
};
2.变量随用随声明。
3.少用malloc/calloc/free,代之以new/delete。
4.少用void*、指针算术、联合、强制类型转换。
5.少用C风格的字符串,进行使用string类型。
6.有意识地使用面向对象的思想。
面向过程/基于对象(BOP)/面向对象(OOP)
c++ 02的更多相关文章
- Kotlin中变量不同于Java: var 对val(KAD 02)
原文标题:Variables in Kotlin, differences with Java. var vs val (KAD 02) 作者:Antonio Leiva 时间:Nov 28, 201 ...
- Android游戏开发实践(1)之NDK与JNI开发02
Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI ...
- iOS系列 基础篇 02 StoryBoard 故事板文件
iOS基础 02 StoryBoard 故事板文件 目录: 1. 故事板的导航特点 2. 故事板中的Scene和Segue 3. 本文最后 在上篇HelloWorld工程中有一个Main.storyb ...
- [转]Tesseract 3.02中文字库训练
下载chi_sim.traindata字库下载tesseract-ocr-setup-3.02.02.exe 下载地址:http://code.google.com/p/tesseract-ocr/d ...
- Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock
本章对ReentrantLock包进行基本介绍,这一章主要对ReentrantLock进行概括性的介绍,内容包括:ReentrantLock介绍ReentrantLock函数列表ReentrantLo ...
- Oracle Recovery 02 - 常规恢复之不完全恢复
背景:这里提到的常规恢复指的是数据库有完备可用的RMAN物理备份. 实验环境:RHEL6.4 + Oracle 11.2.0.4 单实例. 二.常规恢复之不完全恢复:部分数据丢失 2.1 重做日志文件 ...
- 异步编程系列第02章 你有什么理由使用Async异步编程
p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...
- star ccm+ 11.02安装
STAR CCM+是CD-Adapco公司的主打软件,其安装方式较为简单,这里以图文方式详细描述STAR CCM+11.02安装过程. 1 安装准备工作2 正式安装3 软件破解4 软件测试 1 安装准 ...
- 导入项目时,有关[2016-04-03 20:38:02 - Dex Loader] Unable to execute dex: Multiple dex files 问题
最近我在学习androidUI设计,在网上找了一个UI菜单界面开源代码示例,按照步骤导入项目,运行的时候控制台结果报了如下错误: [2016-04-03 20:38:02 - Dex Loader] ...
- java多线程系类:JUC线程池:02之线程池原理(一)
在上一章"Java多线程系列--"JUC线程池"01之 线程池架构"中,我们了解了线程池的架构.线程池的实现类是ThreadPoolExecutor类.本章,我 ...
随机推荐
- jar包版本冲突,并且要保留两个版本都能使用
问题:在做项目时,遇到jar版本冲突的问题,并且老代码依赖不能用新jar包代替,要保证功能不变须要保证两个jar都能使用 思路:使用runtime 的exec 方式另启线程运行,然后返回结果 解决: ...
- [Oracle]Sqlplus连接成功,但pl/sql连接不成功,提示“ora-12145:无法解析指定的连接标识符”
Oracle客户端安装成功后,使用Net Manager配置成功,测试服务成功.使用Sqlplus连接成功.但使用pl/sql developer连接总是提示“ora-12145:无法解析指定的连接标 ...
- Arcgis for js载入天地图
综述:本节讲述的是用Arcgis for js载入天地图的切片资源. 天地图的切片地图能够通过esri.layers.TiledMapServiceLayer来载入.在此将之进行了一定的封装,例如以下 ...
- HDU 3697 Selecting courses(贪心)
题目链接:pid=3697" target="_blank">http://acm.hdu.edu.cn/showproblem.php?pid=3697 Prob ...
- Impala 源码分析-FE
By yhluo 2015年7月29日 Impala 3 Comments Impala 源代码目录结构 SQL 解析 Impala 的 SQL 解析与执行计划生成部分是由 impala-fronte ...
- SqlServer表属性查询
获得表信息: select syscolumns.name as field, syscolumns.isnullable as nullis, systypes.name as sqltype, s ...
- 基尔霍夫矩阵题目泛做(AD第二轮)
题目1: SPOJ 2832 题目大意: 求一个矩阵行列式模一个数P后的值.p不一定是质数. 算法讨论: 因为有除法而且p不一定是质数,不一定有逆元,所以我们用辗转相除法. #include < ...
- FCKeditor插件开发实例:uploadify多文件上传插件
FCKeditor是一个专门使用在网页上属于开放源代码的所见即所得文字编辑器.它志于轻量化,不需要太复杂的安装步骤即可使用.它可和PHP.JavaScript.ASP.ASP.NET.ColdFusi ...
- android与PC互传文件 adb push
1- df 命令查看文件系统的磁盘空间占用情况 shell@android:/ # adb shell df 2- 找到data文件夹, 上传 adb push /data/Sogou Input_ ...
- ECSHOP商城全站自定义TITLE标题设置
对于SEO来说,能让标题自定义的将会大大增加SEO效果,提高独立商城的流量,今天小编就收集从网上弄来ecshop全站自定义代码,很全哦! 1.Ecshop商品分类页如何实现自定义Title 最近发现很 ...