第三章:The C in C++ Thinking in C++ V1

pass-by-value:按值传递,C中只有这一种传递方式,分为数据传递与指针传递(注意指针也是按值传递)。

pass-by-reference:按引用传递,C++独有,可在函数中直接使用内存中存在的变量。
 
引用的特点:

(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有 NULL 引用,引用必须与合法的存储单元关联(指针则可以是 NULL)。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。

 
#include<iostream.h>意味着#include<iostream>加上using namespace std;
 
强制转换:C++比C多了一种转换的语法int(data),在c中只能写成(int)data。

强制类型转换:
C可用:     (int) i;
C++可用:(int) i; int(i);

 

C++的类型检查比C++严格:

int i = 10;
void *vp = &i;//C与C++均可
int *ip = vp;//C中可用,但在C++中不允许

C++中不允许调用未事先声明的函数,但C可以。

 
C++显式运算符:
 
关键字
含义
and
&&
or
||
not
not_eq
 =
bitand
&
and_eq
&= 位与- 赋值
bitor
|或
or_eq
|= 位或- 赋值
xor
位异或
xot_eq
位异或 - 赋值
compl
~ 
 
 
使用函数指针调用函数的正规语法:(*funp)(data),但大部分编译器允许程序员写作funp(data) ,但这只是一种简写的方式。 
 
下面的#和##只能用于宏定义中:

将变量或表达式转化为字符串。

当你在宏变量前加上 # ,预处理器会把宏参数转换为字符串。例如:

#define PR(x) cout << #x " = " << x << "\n"; 

如果  PR(HelloQt) 则输出    HelloQt= 

标志粘贴:##

将两个标识符连接从而形成一个新的标识符。

 

在标准头文件<cassert>中你可以发现assert(),这是一个方便的debug宏。当你使用assert()时,你提供一个参数,也就是一个你认为为真的等式(断言)。

预处理器会生成一些代码测试这个等式,如果断言是假,程序会停止运行并给出断言所处的位置。

 完成测试之后在代码的开始加上      #define  NDEBUG 则可使assert()失效,从而提高效率。

 

在你使用一个函数指针前,你需要为其赋一个函数的地址。就像数组的指针是数组名也就是数组不加方括号,函数的地址是函数的名字,不加圆括号。

 当然也可以使用更明确的方法,使用取址符号, &fun(). 

#include<iostream>
#include<fstream>
#include<vector>
#include<string>
#include<cassert>
using namespace std;

int PR(void )
{

static int cnt = 1;
cout<<"I am PR("<<cnt<<')'<<endl;
cnt++;
return 0;

}

int main()
{

int (*fp)(void);  //定义函数指针
fp = PR; 
PR();
fp();                //这两个使用方法均是正确的,但后者更规范,fp()  这种定义是编译器提供的。
(*fp)();    //      

}

 

posted @ 2015-01-06 21:44  jiahu  阅读(167)  评论(0)    收藏  举报