1、 开始
※ 问题的解决
分而治之,逐步求精
※预定义名字
编译 C++程序时 编译器自动定义了一个预处理器名字__cplusplus
在编译标准 C时 编译器将自动定义名字__STDC__
__LINE__记录文件已经被 编译的行数 __FILE__包含正在被编译的文件的名字
编译时间 __TIME__ 和日期 __DATE__
※assert()是C语台标准库中提供的一个通用预处理器宏 #include <cassert>
assert(__cplusplus); //assert断言
由于所有的 C++库名字是在名字空间std 中被定义的,所以要包含using namespace std;
#include <assert.h> 则不需要包含std即可
2、 C++浏览
※ 信息隐藏
函数调用比直接访问内存的开销要大得多,但是由于“内联函数”信息隐藏并未对程序的执行效率
增加了严重的额外负担,成员函数会被自动的当做内联函数来处理
/**
* 构造函数
*/
Array::Array(int sizeTemp)
{
init(sizeTemp, 0);
}
Array::Array(int *arrayTemp, int array_size) //构造函数
{
init(array_size, arrayTemp);
}
Array::Array(const Array& arrTemp) //复制构造函数
{
init(arrTemp.size, arrTemp.arr);
}
/**
* 初始化函数(共通)
*/
void Array::init(int sizeTemp, int* arrTemp) 函数重复度较高时,提取公共函数
{
size = sizeTemp;
arr = new int[size];
for (int i=0; i<size; i++)
{
if (arrTemp)
{
arr[i] = arrTemp[i];
} else
{
arr[i] = 0;
}}}
※ 名称空间namespace
名字空间别名 namespace alias 允许用一个可替代的,短的或更一般的名字与一个现有的名字空间关联起来
namespace LIB = IBM_Canada_Laboratory;
using指示符使名字空间内的所有声明都可见 using namespace IBM_Canada_Laboratory;
using 声明 using declaration 提供了选择更为精细的名字可视性机制
using IBM_Canada_Laboratory::Matrix;
※ 为了使用名字空间中声明的名字 建议使用带有精细选择功能的 using声明代替 using指示符
3、 C++数据类型
※在一行的最后加上一个反斜杠 表明 字符串文字在下一行继续
“abc \ "abc" "def"
def”
※ 宽字符 wchar_t
宽字符常量用来支持某些语言的字符集合 如汉语日语等中的某些字符不能用单个字符来表示
L'a' L"a wide string"
"two" "some"
"two" L"some" //不建议这样使用,没有为这两种不同类型的连接定义标准行为
※对于每一个变量 都有两个值与其相关联:
1.它的数据值 存储在某个内存地址中
2.它的地址值——即 存储数据值的那块内存的地址
※ 初始化
全局变量和静态变量会被自动初始化,局部变量则不会
类机制通过缺省构造函数来初始化
string project; //类机制初始化
赋值初始化: int ival = 1024;
隐式初始化: int ival( 1024 );
另外 每种内置数据类型都支持一种特殊的构造函数语法 可将对象初始化为0
int ival = int(); // 设置 ival 为 0
※指针
指针不能被初始化或赋值为其他类型对象的地址值
int ival = 0; double *pi2 = &ival; //错误,类型不对
int *ptr = &ival; double *pi = ptr; //错误,2种指针对那块内存的存储布局和内容的解释完全不同
void* 类型指针 它可以被任何数据指针类型的地址值赋值 函数指针不能赋值给它
void *pv = pi;
void*表明相关的值是个地址 但该地址的对象类型不知道 我们不能够操作空类型指针
所指向的对象 只能传送该地址值或将它与其他地址值作比较
※字符串类型
对隐式地将 string 对象转换成 C 风格的字符串 string 类型没有提供支持
char *str = s1; // 编译时刻类型错误
char *str = s1.c_str(); // 几乎是正确的 但是还差一点
为了防止字符数组被 程序直接处理 c_str()返回了一个指向常量数组的指针
const char *str = s1.c_str(); // 正确
※引用
※ const引用和非const引用
const引用可以用不同类型的对象初始化 ---只要能从一种类型转换到另一种类型即可,
也可以是不可寻址的值 如文字常量
// 仅对于 const 引用才是合法的
const int &ir = 1024;
引用在内部存放的是一个对象的地址,它是该对象的别名,对于不可寻址的值 如文字常量以及不同
类型的对象,编译器为了实现引用必须生成一个临时对象,引用实际上指向该对象但用户不能访问它