博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

C++备忘(更新中...)

Posted on 2010-09-10 18:07  扬名  阅读(300)  评论(0编辑  收藏  举报

1、引用与指针有什么区别?

1) 引用必须被初始化,指针不必。

2) 引用初始化以后不能被改变,指针可以改变所指的对象。

3) 不存在指向空值的引用,但是存在指向空值的指针。

 

2、什么是平衡二叉树?

左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1

 

3、堆栈溢出一般是由什么原因导致的?

没有回收垃圾资源

 

4、给两个变量,如何找出一个带环单链表中是什么地方出现环的?

一个递增一,一个递增二,他们指向同一个接点时就是环出现的地方

 

5、如何引用一个已经定义过的全局变量?

可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变量,假定你将那个变量写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。

 

6、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?

可以,在不同的C文件中以static形式来声明同名全局变量。可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。

 

7、对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?

c用宏定义,c++用inline

 

8、写一个“标准”宏,这个宏输入两个参数并返回较小的一个。

#define  Min(X, Y)   ((X)>(Y)?(Y):(X))

 

9、交换两个变量的值,不使用第三个变量。

有两种解法, 一种用算术算法, 一种用^(异或)

a = a +b;

b = a -b;

a = a -b;

or

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

b = a^b;

a = a^b;

or

a ^= b^= a;

 

10、c和c++中的struct有什么不同?

c和c++中struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct可以。

c++中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默认为private

 

11、什么是预编译,何时需要预编译:

  1)总是使用不经常改动的大型代码体。

  2)程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。

 

12、数组地址、指针问题

char str1[] ="abc";

char str2[] ="abc";

 

const char str3[]= "abc";

const char str4[]= "abc";

 

const char *str5 ="abc";

const char *str6 ="abc";

 

char *str7 ="abc";

char *str8 ="abc";

 

cout << (str1 == str2 ) << endl;

cout << (str3 == str4 ) << endl;

cout << (str5 == str6 ) << endl;

cout << (str7 == str8 ) << endl;

 

结果是:0 0 1 1

解答:str1,str2,str3,str4是数组变量,它们有各自的内存空间;

而str5,str6,str7,str8是指针,它们指向相同的常量区域。

 

13、C++ 用宏定义写出swap(x,y)交换函数

   //C++ 用宏定义写出swap(x,y)交换函数,多行语句可用'\'连接

   #define swap(x, y)\

   x = x + y;\

   y = x - y;\

   x = x - y; 


14.地址偏移

  main()

  {

    int a[5]={1,2,3,4,5};

    int *ptr=(int *)(&a+1);

    printf("%d,%d",*(a+1),*(ptr-1));

  }

输出:2,5

*(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5

&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)

int *ptr=(int*)(&a+1);

则ptr实际是&(a[5]),也就是a+5

原因如下:

&a是数组指针,其类型为 int (*)[5],而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。

a是长度为5的int数组指针,所以要加 5*sizeof(int),即ptr实际是a[5]

但是prt与(&a+1)类型是不一样的(这点很重要)

所以prt-1只会减去sizeof(int*)

a,&a的地址是一样的,但意思不一样,a是数组首地址,也就是a[0]的地址,&a是对象(数

组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5].

 

15.如果只想让程序有一个实例运行,不能运行两个。

  把这两行代码插入程序初始位置即可(需要包含:<stdlib.h> & <windows.h> ) :

  CreateMutex(NULL,FALSE,"YourAppName");

  if(GetLastError() == ERROR_ALREADY_EXISTS)

  {

    exit(0);

  }

 

16.定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句

  #define MAX(a,b)   ( abs((a)-(b)) == ((a)-(b))?(a):(b) )

 

17.x=x+1,x+=1,x++哪个效率最高?为什么?

x=x+1 效率最低

1)读取右x地址

2)x+1

3)读取左x地址

4)将右值传给左x 

x+=1 其次

1)读取右x地址

2)x+1

3)将得到的值传给x(x的地址已经读出,故不用读取) 

x++ 效率最高

1)读取右x地址

2)x自增1

故x++效率最高。

 

18.打印出当前源文件的文件名以及源文件的当前行号

#include<stdio.h>

void main()
{
   printf("当前源文件名:%s",__FILE__);
   printf("源文件当前行号:%ld",__LINE__);
}

 

19.main主函数执行完毕后再执行一段代码

/* ATEXIT.C: This program pushes four functions onto
 * the stack of functions to be executed when atexit
 * is called. When the program exits, these programs
 * are executed on a "last in, first out" basis.
 */

#include <stdlib.h>
#include <stdio.h>

void fn1( void ), fn2( void ), fn3( void ), fn4( void );

void main( void )
{
   atexit( fn1 );
   atexit( fn2 );
   atexit( fn3 );
   atexit( fn4 );
   printf( "This is executed first. " );
}

void fn1()
{
   printf( "next. " );
}

void fn2()
{
   printf( "executed " );
}

void fn3()
{
   printf( "is " );
}

void fn4()
{
   printf( "This " );
}

/*
Output

This is executed first.
This is executed next.*/

 

递归和分治策略:http://www.cnblogs.com/chinazhangjie/archive/2010/10/07/1845034.html

重载、重写、覆盖:http://www.cnblogs.com/cuboo/articles/1564607.html