文档介绍:c++ 语法精品 C++ 基本语法(上)(精品) 写在前面的话从大学里面开始接触 C++ 到现在这么长的时间,一直把自己当成 C++ 方面的 Master , 且不论使用这门语言多长时间, 当年狂读<Thinking in C++> 的基础也让自己觉得已经对 C++ 这门语言颇有造诣。尽管不精通于 STL ,总觉得 MFC/ATL 的库足已,能够让我很快写出高质量、高效率的 C++ 代码( 基于 MFC) 。所以<C++ Primer> 、<C++ Programming Language> 只是摆在书架上,供偶尔查证之用。此番重读 C++ ,研读 STL 的代码,受益匪浅,不由得拿出当年攻读<Thinking in C++> 以及研读 MFC 源代码的精神来。毛主席说过,骄傲使人落后,这次重读 C++ 使得我每每汗颜于此,学海无涯, 人外有人。推此及彼, 其实又何尝只在 C++ 、技术邻域呢? 自满因谦虚变成自信。 0. 编译 C++ 程序时,编译器自动定义了一个预处理名字__cplusplus ,而编译标准 C 时,自动定义名字__STDC__ 。另外几个比较有用的预定义名字是__LINE__( 文件的当前编译行数), __FILE__( 当前被编译的文件名字), __DATE__( 编译日期)和__TIME__( 编译时间)。 库头文件的 C++ 名字总是以字母 C 开头, 名字,如<> 在 C++ 库中的名字是<cassert> 。两种使用方法: #include <> 或者#include <cassert> using namespace std; 2. 静态与动态内存分配的两个主要区别: (1) 静态对象是有名字的变量, 可以直接进行操作, 动态对象是没有名字的变量, 可以通过指针间接进行操作; (2) 静态对象的分配和释放由编译器自动处理, 而动态对象必须由程序员显式的管理,通过 new 和 delete 两个表达式来完成。 3. 类的缺省构造函数是不需要用户提供任何参数的构造函数。 4. STL 中标准数组-vector( 文件<vector>) , 两种遍历方式: (1) 通过下标操作符; (2) 使用迭代器,如 vector<int>::iterator iter; 可以通过对 iterator 解引用来直接访问实际的元素*iter;STL 提供了作用于容器类型的泛型算法,头文件<algorithm> 。 5. 文字常量是不可寻址的。 6. 常用的几个转义序列: newline( 换行符) \n \14 horizontal tab( 水平制表符) \t vertical tab( 垂直制表符) \v backspace( 退格符) \b carriage return( 回车键) \r formfeed( 进纸键) \f alert (bell)( 响铃符) \a \7 7. 变量和文字常量都有存储区, 区别在于变量是可寻址的, 对于每个变量, 都有两个值与之关联: 数据值, 称为对象的右值, 是被读取的值, 文字常量和变量都可以用作右值; 地址值, 被称为变量的左值,是位置值,文字变量不用被用作左值。 8. 每个指针都有一个相关的类型。不同数据类型的指针之间的区别在于指针所指的对象的类型上。如果我们需要的仅仅是持有地址值, C++ 提供了一种特殊的指针类型:空(void *) 类型指针,它可以被任何数据指针类型的地址值赋值, 除了函数指针。不能操作空类型指针所指向的对象,只能传送该地址值或将它与其他地址值做比较。 风格的算法循环: while(*p++){...} 10. 正确定义引用,如下: const int ival = 1024; const int *&pi_ref = &ival; // 错误, pi_ref 是一个引用,它指向定义为 const 的 int 型对象的一个指针, 引用不是指向常量, 而是指向了一个非常量指针 const int *const &pi_ref = &ival; // OK 11. 指针和引用有两个主要区别,引用必须总是指向一个变量;如果一个引用给另外一个引用赋值, 那么改变的是被引用对象而不是引用本身。 12. 布尔类型对象虽然也被看作整数类型的对象,但是它不能被声明为 signed , unsigned , short 或 long 。 13. 一个数组不能被另外一个数组初始化,也不能被赋值给另外一个数组,而且, C++ 不容许声明一个引用数组。 14. 数组标志符代表数组中的第一个元素的地址。它的类型是数组元素类型的指针。 int ia[10]; 第一个元素的地址: ia 或者是&ia[