1、定义一个宏:交换两个变量的值,不使用第三个变量

(1)算数方法

a = a + b;
b = a - b;
a = a - b;

(2)异或方法

a = a^b; // 只能对int,char..
b = a^b;
a = a^b;

2、进程和线程的区别。

线程是指进程内的一个执行单元,也是进程内的可调度实体.
与进程的区别:
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源. 
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

3、指针和引用有什么分别

(1) 引用在创建的同时必须初始化,即引用到一个有效的对象;而指针在定义的时候不必初始化,可以在定义后面的任何地方重新赋值.

(2) 不存在NULL引用,引用必须与合法的存储单元关联;而指针则可以是NULL.

(3) 引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用;而指针在任何时候都可以改变为指向另一个对象。

(4) 引用的创建并不会调用类的拷贝构造函数

(5) 语言层面,引用的用法和对象一样;在二进制层面,引用一般都是通过指针来实现的,只不过编译器帮我们完成了转换.

 

如果传引用比传指针安全,为什么?如果我使用指针常量难道不行吗?

不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,显得很安全。

 指针常量仍然存在空指针,并且有可能产生野指针.

 总的来说:引用既具有指针的效率,又具有变量使用的方便性和直观性.

4、常量和引用的初始化必须放在构造函数正在建立数据成员结构的时候,也就是放在构造函数的冒号后面。类中的成员以其在类中声明的顺序构造,而不是看构造函数说明中冒号后面成员初始化的顺序。原因是如果构造函数中指定了一个特殊的构造顺序,那么析构函数不得不去查询构造函数的定义,以获得如果对成员进行析构的顺序,由于构造函数和析构函数可以在不同的文件中定义,这就将给编译器的实现者造成一个难题,更遭的是,一个类可以有两个或者更多的构造函数,对于这些构造函数的定义,我们并不能保证它们中的成员出现的实现都是一致的。所以使用类的声明来解决成员的构造和析构顺序。

5、缺省情况下,在构造函数的函数体被执行前,对象中的所有成员都已经被它们的缺省构造函数所初始化了。那些没有构造函数的成员则将拥有一个未定义的初始值。如果我们在构造函数定义中的参数列表结束的括号后面增添一个冒号以及一个初始体列表,每个初始体都包括一个名字以及一个参数列表,则会告诉编译器只使用一次函数调用来初始化列表中的成员。如果有这样一个构造函数:
Classname::Classname(const String& variantname)
{
 variant=variantname;
}
此时由于String是一个类,类Classname成员variant先将会被String的缺省构造函数所初始化,其值不定,然后在Classname的构造函数中,它的值又会因为赋值操作而再一次改变。这是两个步骤,可以通过上面的方法合成一个步骤,如:
Classname::Classname(const String& variantname):variant(variantname){}

6、如果不是作为类的成员变量,则常量变量和引用变量必须在声明的时候初始化。如果是类的成员变量,则参照5

7、类中静态成员必须初始化(在类外)如:int Classname::variantname=100;