第三章:The C in C++ Thinking in C++ V1
pass-by-value:按值传递,C中只有这一种传递方式,分为数据传递与指针传递(注意指针也是按值传递)。
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有 NULL 引用,引用必须与合法的存储单元关联(指针则可以是 NULL)。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
强制类型转换:
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可以。
|
关键字
|
含义
|
|
and
|
&&
|
|
or
|
||
|
|
not
|
!
|
|
not_eq
|
! =
|
|
bitand
|
&
|
|
and_eq
|
&= 位与- 赋值
|
|
bitor
|
|或
|
|
or_eq
|
|= 位或- 赋值
|
|
xor
|
位异或
|
|
xot_eq
|
位异或 - 赋值
|
|
compl
|
~ 补
|
将变量或表达式转化为字符串。
当你在宏变量前加上 # ,预处理器会把宏参数转换为字符串。例如:
#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)(); //
}

浙公网安备 33010602011771号