Tip 1: #include包含头文件的问题
新的编译器格式:
#include <iostream> using namespace std;
旧的编译器格式:
#include <iostream.h>
注:旧的编译器格式中,包含头文件后,不添加 “using namespace std”
Tip 2:Windows环境中 ,程序运行时界面自动关闭、一闪而过的问题
解决方法:在main() 的return 语句前添加 cin.get() 语句;
有时需添加两行这样的代码。
注:cin.get() ,可以读取空格、制表符和换行符。
Tip 3:C++程序 中也可以使用 C 语言中的输入输出函数,只需包含头文件”stdio.h”
Tip 4:访问命名空间std的方法:
M1:将 using std namespace; 放在函数定义之前,让文件中所有的函数都能够使用名称空间 std 中所有的元素
M2:将 using std namespace; 放在函数定义中,这样该函数能使用命名空间中所有的元素
M3:在特定的函数中使用 using std::cout; 这样的命令而不是 using std namespace; 让该函数能够使用指定的元素,如cout
M4:完全不使用变异命令 using , 在需要使用名称空间 std 中的元素时,使用前缀 std:: ,如下所示
std::cout << “In This Way” << std::endl ;
Tip 5:C++中的语句类型:
l 声明语句——定义函数中使用的变量的名称和类型
l 赋值语句——使用复制操作符 (=) 给变量赋值
l 消息语句——将消息发送给对象,激发某种行动
l 函数调用——执行函数.被调用的函数执行完毕后,程序返回到函数调用语句后面的语句
l 函数原型——声明函数的返回类型、函数接受的参数数量和类型
l 返回语句——将一个值从被调用的函数那里返回到调用函数中
Tip 6:拼接字符串常量
C++允许拼接 “字符串常量”,任何两个由空白(空格、制表符、换行符)分隔的字符串常量都将自动拼接成一个。
下列语句等效
cout << “Hello World” << endl; cout << “Hello” “ World” << endl; cout << “Hello” “ World” << endl; cout << “Hello” “ World” << endl;
Tip 7:sizeof() 与strlen() 判断字符数组长度的区别
l sizeof() 返回值是 整个数组的长度;而strlen() 返回的是字符数组中字符串的长度(strlen() 只计算可见字符,不把空字符 ‘\0’ 计算在内),而不是数组的长度。
如:存放 ”cosmic” 时,字符数组长度应不小于 strlen( cosmic ) + 1 。
Tip 8:空指针,当计算机没有足够内存而无法满足new 的请求时,new将返回。
C++中值为的指针被称为空指针(null pointer),C++确保空指针不会指向有效的数据。
因此,空指针常被用来表示操作符或函数失效。
Tip 9:数组名 和 指针的差别:
数组名是常量,存放的是数组首个元素的地址,不能修改数组名的值;
指针是变量,可以改变它的值。
Tip 10:枚举 的取值范围
上限:找到枚举量的最大值,然后找到大于这个最大值的、最小的2的幂,将它减去1,
得到的便是上限
下线:找到枚举量的最小值,如果它小于,则下限为;若它小于,先忽略符号,按照上面的方法,得到上限,再加上负号,就得到下限。
Tip 11:cin 输入输出的问题
发送给cin的输入被缓冲,也就是说,只有当用户按下回车键后,才会将以输入的内容发送给程序;而且,cin 会忽略输入的空格和换行符。
如下列程序中:
输入:Hello world this is my # test program
输出:Helloworldthisismy
若要获取输入的空格或换行符,应使用cin.get (char) ;
注:使用cin 读取字符时,会忽略空格;
若要检查每个字符(包括空格、制表符、换行符),应使用cin.get( ch )。
Tip 12:#define 和 typedef 的区别
下列语句中, pa是一个指针,pb是一个整型变量
#define INT_POINTER int * INT_POINTER pa, pb;
Tip 13:关于const 指针的问题
如果关键字const 出现在 * 的左边, 表示被指物是常量;
如果关键字const 出现在 * 的右边, 表示指针自身是常量
如果出现在 * 的两边, 表示 被指物 和 指针 两者都是常量.
int const * pi; const int * pi;
两种写法一样, pi指向一个常量
Tip 14:将引用参数声明为常量数据的引用的理由
l 使用const 可以避免无意中修改数据的编程错误
l 使用const 使函数能够处理 const和 非const 实参,否则将只能接受与非const数据
l 使用const 引用使函数能够正确生成并使用临时变量
Tip 15:何时使用引用参数
l 程序员能够修改调用函数中的数据对象
l 通过传递引用而不是整个数据对象,可以提高程序的运行速度。
注:当数据对象较大时 (如结构和类对象),第二个原因最重要。这些也是使用指针参数的原因。 这是有道理的,因为,引用参数实际是基于指针的代码的另一个接口。
Tip 16:何时用指针?何时用引用?
对于使用传递的值而不做修改的函数:
l 如果数据对象很小,如内置数据类型或小型结构,则按值传递。
l 如果数据对象是数组,则使用指针,因为这是唯一的选择,并将指针声明为指向const的指针
l 如果数据对象是较大的结构时,则使用const指针或const引用,以提高程序效率,这样可以节省复制结构所需的时间和空间
l 如果数据对象是类对象,则使用const 引用。类设计的语义常常要求使用引用,这是C++新增这项特性的主要原因,因此,传递类对象参数的标准方式是按引用传递。
对于修改调用函数中数据的函数:
l 如果数据对象是内置数据类型,则使用指针。如果看到诸如fixit (& x) 这样的代码,(其中 x 是int型),则很明显,该函数将修改x
l 如果数据对象是数组,则只能使用指针。
l 如果数据对象是结构,则使用引用或指针
l 如果数据对象是类对象,则使用引用
Tip 17:在类对象中,赋值 != 初始化
C++规定,对象的成员变量的初始化动作发生在进入构造函数本体之前。
因此,正确的初始化方式为:
class Apple { public : … string color; Apple(); Apple(string tmp):color(tmp) {} // 初始化 ( initializations ) // 构造函数本体不必有任何动作 private: … };
Tip 18: C++默默编写并调用的函数
class Empty { public : Empty() { … } // default 构造函数 Empty(const Empty& rhs) { … } // copy 构造函数 ~Empty() { … } // 析构函数 Empty& operator=(const Empty& rhs) { … } // copy assignment 操作符. };
只有当这些函数被需要( 被调用 ),它们才会被编译器创建出来。
程序中需要它们是很平常的事。下面的代码导致上述每一个函数被编译器产出:
Empty e1; // default 构造函数 // 析构函数 Empty e2 ( e1 ); // copy构造函数 e2 = e1; // copy assignment 操作符
Tip 19: 类中的 static类型函数不能接收 this 指针