/*
达内学习 C++ day46 2013-11-6
*/
一,c++发展
1983 正式命名
1987 GNU c++
1992 微软 ibm c++
1998 c++98
2003 c++03
2011 c++0x
gcc **.cpp -std=c++0x;
二,第一个C++程序
1,文件后缀 .c .cpp .cxx .C 推荐.cpp
2, 标准C++没有.h头文件
cstdio cstring ctime
3, 引入头文件 实际是对数据的声明
using namespace std;
4,编译器
gcc **.cpp -lstdc++
g++ **.cpp
-S 生成汇编 -O 优化 -g生成调试信息 -E预处理 -I 头文件位置 -l库的位置
三,命名空间
1,命名空间的概念
将一组相关的数据包装到一起,然后给这个包装的名字起一个逻辑名称。
2,目的
方便管理数据 防止命名冲突
3,语法
namespace -name{
数据
}
空间中的数据 声明和实现 是可以分开的
4,命名空间使用
5,特殊的命名空间 匿名命名空间
namespace{
数据
}
6,命名空间的嵌套
四,c++中的 结构 联合 枚举
1,结构
定义变量时可以不使用 struct
结构体中可以定义函数
c++中没有任何成员 结构体大小是1
2,联合
定义变量时 可以不在使用 union
支持匿名联合
(大端序 小端序 for)
3,枚举
定义变量时候,可以不再使用 enum
本质上是整数,所以枚举值可以赋值给int
但是c++类型检查更严格,int 不能赋值给 enum
五,bool 类型
c++ 作为一种特定的类型
取值只有 true(1) false(0)
赋值可以为任意值 只要不是 NULL 0 '\0' false 其他都是真
六,替换
七,c++中的函数
1,无参的参数列表,严格匹配,void依然可以用
2,c++函数 必须前置声明,不再支持隐式声明
3,返回值不能省略 main函数除外
4,c++中的函数重载
a,什么是函数重载
在同一作用域,函数名相同,参数列表不同,返回值任意叫重载(overload)
参数列表不同是 参数个数 类型 顺序 不同都会是列表不同
b,函数重载的原理
当编译生成代码时 函数调用名 会根据函数名和参数列表重新生成调用名。
c,函数重载的好处
对函数的实现者 函数的名字简单
对函数的调用者 不用考虑类型 方便调用
d,重载的引入带来的问题 和解决方案
跨编译器调用
防止编译器改名 extern "C" int add(int a,int b)
如果用c++ 实现一个函数需要在实现中加上一个extern "C" 然后提供供C调的 头文件
如果c实现函数,需要给c++ 提供一个调用头文件 头文件中需要加一个 extern "C"
5,哑元
参数只有类型 没有形参名
作用就是保持函数的向前兼容 区分函数
6,参数默认值
不传参默认,传参以后替代
注:参数的默认值必须靠右 ;当函数的声明和实现分离时,参数默认值写在头文件中。
不能和重载函数形成冲突。
参数默认值的好处:简化传参
7,内联函数
宏函数 预处理时候完成替换
内联函数 编译时完成替换
inline void test()
内联只是一种请求 如果请求成功 则把代码粘贴过去 如果请求不成功则变成普通
代码量大或者函数递归时候 不容易请求成功。
八,内存分配
new delete 申请单个内存
new[] delete[] 申请多个内存
int*p = new int; 初值不保证是 0
可以指定初始值 int* p =new int(0)
释放内存 delete p ; 注意释放以后要置 NULL
/* 申请多个内存对象 */
int *parr = new int[5];
parr[0] = 9; parr[1] = 5;
/* 释放内存 */
delete[] parr; //成对new[] delete[] 必须带[]
定位分配
char data[100];
int *parr = new(data)int[25]; 不用释放
九,c++中的引用
1,什么是引用
引用就是一个对象的别名
2,如何定义引用
int a = 100;
int& b =a; //引用必须初始化
3, 引用一旦确定就不能修改
char *const p; //指针指向不能改变
const char * p;//指针指向可以改变
4,const 引用
const int& ra =100; //不加const不可以 后面是常量
5,函数中 参数的值传递 和 引用传递
设计一个函数 传入来两个整数参数 交换两个整数参数的值
引用作为参数的目的 减少参数的赋值,达到函数内部修改外部数据的目的
6,引用作为函数的返回值
把函数的返回值 做左值,
返回的引用一定要确保函数调用完成后 引用保持合法
int& add(int& a,int b)
{
a+b;
return a;
}
十,C++ 中的类型转换
a,static_cast<类型>(变量名)
在某个方向上可以做隐式类型转换
void* pv;
int* pa=&a;
pv = pa;
pa = static_cast<int*>(pv);
b,动态转换 dynamic_cast<类型>(变量名)
有继承关系 类型之间进行转换
c,const_cast<类型>(变量)
去掉const修饰的
volatile const int a = 100; //volatile 每次用到从内存中取出
int * pa = const_cast<int*>(&a);
*pa = 1000; //不加volatile 的话 不能修改成功
d,重新解释
reinterpret_cast<类型>(变量);
允许任何类型之间进行转换,包括指针——整数 整数--地址
十一,c++之父给c给c程序员的建议
1,尽量少使用宏, 使用const enum去定义常量,使用inline 代替带参宏
使用namespace 防止命名冲突
2,变量随时用 随时去定义 以保证初始化
3,尽量使用引用 代替指针
4,尽量多的使用const 修饰(函数的参数是引用或者指针类型)
5,c++使用string 代替c 字符数组和指针
6,面向对象