专栏首页大学生计算机视觉学习DeepLearning一、c++中经常被面试官面试的小问题总结(本篇偏向基础知识)

一、c++中经常被面试官面试的小问题总结(本篇偏向基础知识)

原文作者:aircraft

原文链接:https://www.cnblogs.com/DOMLX/p/10711810.html

1.类中的函数定义后加了一个const代表什么?

代表它将具备以下三个性质:

  1.const对象只能调用const成员函数。
   2.const对象的值不能被修改,在const成员函数中修改const对象数据成员的值是语法错误
  3.在const函数中调用非const成员函数是语法错误


  任何不会修改数据成员的函数都应该声明为const类型。
  如果在编写const成员函数时,不慎修改了数据成员,
 或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。
 所以看完上面这句话就应该明白了函数定义后加const的用处,以及什么时候用到const,这会是一个好的编程习惯的。

以下程序中,类stack的成员函数GetCount仅用于计数,从逻辑上讲GetCount应当为const函数。编译器将指出GetCount函数中的错误。
class Stack
{
  public:
void  Push(int elem);
int  Pop(void);
int GetCount(void)  const; // const成员函数
  private:
int m_num;
int m_data[10];
};

int Stack::GetCount(void)  const
{
++ m_num; // 编译错误,企图修改数据成员m_num
Pop(); // 编译错误,企图调用非const函数
return m_num;
}

 2.#include<>与#include""的区别?

<>表明这是一个工程或者标准头文件。查找过程会首先检查预定义的目录,我们可以通过
设置搜索路径环境变量或者命令行选项来修改这些目录、

“”表明该文件是用户自定义的头文件,查找时应从当前目录或者指定目录查找。

总结:自己的定义的头文件用双引号导入,像库文件之类的标准头文件用<>导入

3.c++中的双冒号::

1、表示“域操作符”
例:声明了一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出f的定义,那么在类外定义f时,
就要写成void A::f(),表示这个f()函数是类A的成员函数。

2、直接用在全局函数前,表示是全局函数
例:在VC里,你可以在调用API 函数里,在API函数名前加::

3、表示引用成员函数及变量,作用域成员运算符

4、变量前面的双冒号::,代表引用全局变量,比如我在全局定义了一个全局变量
int value = 1;

局部函数内又定义了一个 int value = 2;

而在这个局部函数中我想给全局那个变量赋值就这样 ::value = 250;

4.宏参数的连接,#和##符号的作用。

某面试题:求下面输出结果
一般用法   我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.

#define STR(s)      #s  

#define CONS(a,b)   int(a##e##b)

printf(STR(vck));            // 输出字符串"vck"       
printf("%d\n", CONS(2,3));   // 2e3 输出:2000 

5.static定义的函数如何在其他文件调用?(不能在其他文件直接调用!!!)

1. 通过函数指针的方式, 我们只要得到这个函数的地址,那么就一定可以调用它,
大家要知道static函数是对编译器起作用的,在运行时根本没有static了,有的只是函数地址,
所以只要搞到函数地址管它是不是static的,照调不误,

2. 通过非static函数的方式,我们可以定义一个普通的函数,
让这个普通函数调用static函数,让后在把这个普通函数在头文件中声明
举例:利用可在本文件调用的属性,另加一个函数fun,fun调用该static函数;其他文件调用fun即可。

另外,要强调,extern不能作用在static函数

6.sizeof计算变量空间容易出错的地方?

某面试题:
char str[] = "hello";
sizeof(str)=_?_

void Func(char str[100])
{
   sizeof(str)=_?_           
}
第一个答案是6,因为对数组变量进行sizeof运算的时候得到的是数组占用内存。

第二个答案是4,在函数中形参的作用是传址,本质是一个指针,指向了一个str[100]。

某面试题:
 
class A
{
    public:
        char c1;
        int i;
        char c2;
};
int main()
{
    printf("%d",sizeof(A));
    return 0;
}
问输出是多少?
  很多人都是直接相加求值,但是sizeof对类以及结构体作用时会有一个字节对齐机制,
对齐机制的对齐方式为其最大成员对齐方式,会将定义变量的内存补全,方便系统运算。
c1的偏移量为0,i的偏移量为4,c1与i之间便需要3个字节填充。
c2的偏移量为8,那么结果就是1+3+4+1=9,由于这里最宽的字节
为int,4个字节。补全之后答案为12.   这里吧Int换成double的话答案就是24

也可以自己手动是设置对齐方式,只要在程序的开头部分 加上一句 #pragma pack(x) 

7.内联函数与宏的区别?

1、内联函数在编译时展开,宏在预编译时展开。
2、在编译的时候,内联函数可以被镶嵌到代码中,而宏只是一个简单的文本替换。
3、宏不是函数,inline是函数。
4、宏在定义的时候容易因为二义性出错,而内联函数不会。

 8.内联函数比宏优势在什么地方?

9.为什么不把所有函数都定义成内联函数呢?

10.下面输出为多少?(某年微软面试题)

int func(x) 
{ 
  int countx = 0; 
  while(x) 
   { 
    countx ++; 
    x = x&(x-1); 
   } 
  return countx; 
} 

假定x = 9999。 答案:8

思路:将x转化为2进制,看含有的1的个数。

这是面试题总结第一篇,后面还有一大堆呢。想要的话关注我噢!!!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 学习c++中的小问题总结

    徐飞机
  • c++ MFC图像处理CImage类常用操作代码

    原文地址:https://www.cnblogs.com/DOMLX/p/9598974.html

    徐飞机
  • c++ 网络编程(三)TCP/IP LINUX/windows 进程间的通信原理与实现代码 基于多进程的服务端实现

    原文链接:https://www.cnblogs.com/DOMLX/p/9613027.html

    徐飞机
  • C++之const成员函数

    由于const函数的隐藏参数this指针变成了const 类名*this,所以const函数不能修改类的数据成员的值,但可以使用类的数据成员。

    zy010101
  • BZOJ4868: [Shoi2017]期末考试

    Description 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布。第i位同学希望在第ti天 或之前得知所.有.课程的成绩。...

    attack
  • C++仿函数

    我们先从一个非常简单的问题入手。假设我们现在有一个数组,数组中存有任意数量的数字,我们希望能够计数出这个数组中大于10的数字的数量,你的代码很可能是这样的:

    Dabelv
  • 记一次 Kafka 重启失败问题排查

    在 2 月10 号下午大概 1 点半左右,收到用户方反馈,发现日志 kafka 集群 A 主题 的 34 分区选举不了 leader,导致某些消息发送到该分区时...

    张乘辉
  • C++之运算符重载

    C++引入引用的概念后, 表达式可以被赋值的现象就出现了, 有的表达式可以被赋值,有的表达式则不可以。 比如, int a; int b; int c; (a=...

    用户5426759
  • Android 移动直播(LiteAV)直播播放如何获取YUV数据

    开发者因为场景需要,希望能获取到视频画面的原始数据(YUV 数据),然后再进行处理或渲染。

    腾讯云-yyuanchen
  • 微信小程序版本自动更新

    w候人兮猗

扫码关注云+社区

领取腾讯云代金券