博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++常见面试题汇总
阅读量:4212 次
发布时间:2019-05-26

本文共 2165 字,大约阅读时间需要 7 分钟。

1.面向对象的三大特性

封装、继承、多态

2.变量的声明和定义有什么区别

为变量分配地址和存储空间的称为定义,不分配地址的成为声明。一个变量可以在多个地方声明,但是只在一个地方定义。加入extern修饰的是变量的声明,说明

此变量将在文件以外或在文件后面部分定义。

3.sizeof和strlen的区别

sizeof是一个操作符,strlen是库函数

sizeof的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为‘\0‘的字符串作参数

编译器在编译时就计算出了sizeof的结果。而strlen函数必须在运行时才能计算出来。并且sizeof计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度。

 

4.C语言的关键字static 和C++ 的关键字static 有什么区别

首先,C++是C的超集,所以static在C中的用法 对于C++来说是全盘接受的,而两者的不同也就是C++中多出来的特性,而这些多出来的特性与C++面向对象的特性有关,或更具体的说,就是static在“类”中的意义和作用。

1:C语言中的Static使用:
  1.1  C中static变量 的影响其实不在作用域而在于 其“存储方式”:
  即在函数内定义的static变量,其作用域仍然在函数内;在函数外定义的static变量,其作用域也在函数外,属于变量所在的文件的作用域。
static 的静态存储方式使得:同一函数的所有static变量的“副本”都共用一个该变量。所以使用了static变量的函数一般是“不可再入”的,不是“线程安全”的。
  1.2  C中static函数 的作用:
C中static函数还有另外一个名字,叫:内部函数。从名字也可看出,C中的static函数的定义将函数“局部化”,使其访问权限被限制在当前文件内部,这实际上说明的是一种“代码的隐藏机制”,通过和extern函数(外部函数)的联合使用,可以实现C语言中函数的模块化设计,这有点类似与C++ 中的Public和private关键字的味道。  当然,如果在C中,函数默认的访问权限是extern的,所以关键字extern往往省略不写。
2: C++类中定义的Static变量和函数
其实本质上与C中的情况一致,不在于作用域(还是类的作用域),而在于其“存储方式”决定了Static变量将与类存储在一起(因为类本身在内存中有其原型的内存空间),而类的实例将共享这一static变量,所以static变量也不是“线程安全”的。
而static成员函数的设置,主要是为了访问静态变量,或者完成某些独立于类实例的功能。

 

5.一个指针可以是volatile吗

volatile告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取。指针和普通变量一样,有时也有变化程序的不可控性。

常见的例子:子中断服务子程序修改一个指向一个buffer的指针时,必须用volatile来修饰这个指针。(以下是摘抄的问题)

1)一个参数既可以是const还可以是volatile吗?解释为什么。 

2) 一个指针可以是volatile 吗?解释为什么。 

3) 下面的函数有什么错误:

int square(volatile int *ptr) { return *ptr * *ptr; }

1)是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

2)是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。

3)这段代码有点变态。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:

long square(volatile int *ptr) { int a; a = *ptr; return a * a; }

 

 

 

 

由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是 

你所期望的平方值!正确的代码如下:

6.a和&a的区别

a是一级指针,&a是二级指针

 

#incude
void main(void){ int a[5] = {1,2,3,4,5}; int *ptr = (int*)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); return ;}

输出结果:2,5

 

 

7.C++的空类有哪些默认成员函数(以前被问过)

注意,只有当实际使用这些函数的时候,编译器才会去定义它们。

1.缺省构造函数

2.缺省拷贝构造函数

3.缺省析构函数

4.缺省赋值运算符

5.缺省取址运算符

6.缺省取址运算符const

 

8.拷贝构造函数和赋值运算符的认识

(1)拷贝构造函数生成新的类对象,而赋值运算符不能

(2)由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象是否和新建对象相同。而赋值运算符则需要这个操作,另外赋值运算符中如果原来的对象中有内存分配,要先把内存释放掉。

(3)当类中有指针类型的成员变量时,一定要重写拷贝构造函数和赋值运算符,不能使用默认的。

 

 

 

 

 

 

 

 

 

转载地址:http://viumi.baihongyu.com/

你可能感兴趣的文章
cpufreq变频子系统
查看>>
怎样做可靠的分布式锁,Redlock 真的可行么?
查看>>
[图文] Seata AT 模式分布式事务源码分析
查看>>
__asm__ __volatile__("":::"memory"),内存屏障(memory barrier)
查看>>
添加系统调用的方法,2.6.35(没有测试)
查看>>
v4l2
查看>>
wubi的错
查看>>
Saving Data in SQL Databases
查看>>
textFields
查看>>
pm 源码分析
查看>>
Sending the User to Another App
查看>>
kmsg_dump
查看>>
Getting a Result from an Activity
查看>>
Allowing Other Apps to Start Your Activity
查看>>
dev/mem
查看>>
pfn_valid 源码分析
查看>>
dev/kmem 和dev/mem的区别
查看>>
checkbox
查看>>
Sending Simple Data to Other Apps
查看>>
Receiving Simple Data from Other Apps
查看>>