C++备忘(更新中…)

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.如果只想让程序有一个实例运行,不能运行两个。

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

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

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

#include

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
原文链接: https://www.cnblogs.com/pure/archive/2010/09/10/1822459.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/14885

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午2:41
下一篇 2023年2月7日 下午2:42

相关推荐