【C++基础】常见面试问题(二)

1. 指针和引用的区别

  • 指针保存的是所指对象的地址,引用是所指对象的别名,指针需要通过解引用间接访问,而引用是直接访问
  • 指针可以改变地址,从而改变所指的对象,而引用必须从一而终;
  • 引用在定义的时候必须初始化,而指针则不需要;
  • 指针可以为空,引用不能为空
  • 可以有const指针,没有const引用

 

2. 头文件中的 ifndef/define/endif 是干什么用的? 该用法和 program once 的区别?

相同点:

  • 它们的作用是防止头文件被重复包含。

不同点

  • ifndef 由语言本身提供支持,但是 program once一般由编译器提供支持,也就是说,有可能出现编译器不支持的情况(主要是比较老的编译器)。
  • 通常运行速度上 ifndef 一般慢于 program once,特别是在大型项目上, 区别会比较明显,所以越来越多的编译器开始支持 program once。
  • ifndef 作用于某一段被包含(define 和 endif 之间)的代码, 而 program once 则是针对包含该语句的文件, 这也是为什么 program once 速度更快的原因。
  • 如果用 ifndef 包含某一段宏定义,当这个宏名字出现“撞车”时,可能会出现这个宏在程序中提示宏未定义的情况(在编写大型程序时特性需要注意,因为有很多程序员在同时写代码)。相反由于program once 针对整个文件, 因此它不存在宏名字“撞车”的情况, 但是如果某个头文件被多次拷贝,program once 无法保证不被多次包含,因为program once 是从物理上判断是不是同一个头文件,而不是从内容上。
     

 

3 当i是一个整数的时候++i和i++那个更快一点?i++和++i的区别是什么?
答:理论上++i更快,实际与编译器优化有关,通常几乎无差别。

//i++实现代码为:
int operator++(int)
{int temp = *this;++*this;return temp;
}//返回一个int型的对象本身// ++i实现代码为:
int& operator++()
{*this += 1;return *this;
}//返回一个int型的对象引用

i++和++i的考点比较多,简单来说,就是i++返回的是i的值,而++i返回的是i+1的值。也就是++i是一个确定的值,是一个可修改的左值,如下使用:

cout << ++(++(++i)) << endl;
cout << ++ ++i << endl;

这里有很多的经典笔试题,一起来观摩下:

#include <iostream>
using namespace std;int main()
{int i = 1;printf("%d,%d\n", ++i, ++i);    //3,3printf("%d,%d\n", ++i, i++);    //5,3printf("%d,%d\n", i++, i++);    //6,5printf("%d,%d\n", i++, ++i);    //8,9return 0;
}

输出结果:

分析:

  • 首先是函数的参数入栈顺序从右向左入栈的,计算顺序也是从右往左计算的,不过都是计算完以后再进行的压栈操作:
  • 对于第1个printf,首先执行++i,返回值是i,这时i的值是2,再次执行++i,返回值是i,得到i=3,将i压入栈中,此时i为3,也就是压入3,3;
  • 对于第2个printf,首先执行i++,返回值是原来的i,也就是3,再执行++i,返回值是i,依次将3,5压入栈中得到输出结果
  • 对于第3个printf,首先执行i++,返回值是5,再执行i++返回值是6,依次将5,6压入栈中得到输出结果
  • 对于第4个printf,首先执行++i,返回i,此时i为8,再执行i++,返回值是8,此时i为9,依次将i,8也就是9,8压入栈中,得到输出结果。

上面的分析也是基于VS搞的,不过准确来说函数多个参数的计算顺序是未定义的(the order of evaluation of function arguments are undefined)。笔试题目的运行结果随不同的编译器而异

 

4. 

  • ## 引用是否占用内存空间? ##(自娱自乐,仅供参考 

2. 引用占用内存空间吗?
如下代码中对引用取地址,其实是取的引用所对应的内存空间的地址。这个现象让人觉得引用好像并非一个实体。但是引用是占用内存空间的,而且其占用的内存和指针一样,因为引用的内部实现就是通过指针来完成的。

// 比如 Type& name; <===> Type* const name。
int main(void)
{int a = 8;const int& b = a;int* p = &a;*p = 0;cout << a; //output 0return 0;
}

 

参考资料

1. C/C++常见面试知识点总结附面试真题----20190407更新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/385231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

static关键字用法

static修饰局部变量 静态局部变量存储在全局静态区生存期为整个程序生命周期&#xff0c;但是其作用域仍与自动变量相同&#xff0c;只能在定义该变量的函数内使用该变量。退出该函数后&#xff0c;尽管该变量还继续存在&#xff0c;但不能使用它。静态局部变量若在声明时未赋以…

1039 到底买不买 (20 分)

小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串&#xff0c;但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下&#xff0c;某串珠子里是否包含了全部自己想要的珠子&#xff1f;如果是&#xff0c;那么告诉她有多少多余的珠子&#xff1b;如果…

存储

一、多重继承&#xff08;无虚函数覆盖&#xff09; 下面&#xff0c;再让我们来看看多重继承中的情况&#xff0c;假设有下面这样一个类的继承关系。注意&#xff1a;子类并没有覆盖父类的函数。 class Base1 { public: virtual void f() { cout << "Base1::f&quo…

BTree和B+Tree详解

B 树是为了磁盘或其它存储设备而设计的一种多叉&#xff08;下面你会看到&#xff0c;相对于二叉&#xff0c;B树每个内结点有多个分支&#xff0c;即多叉&#xff09;平衡查找树。 B 树又叫平衡多路查找树。一棵m阶的B 树 (m叉树)的特性如下&#xff1a; 树中每个结点最多含…

【1】MySQL的四种事务隔离级别

二、事务的并发问题 1、脏读&#xff1a;事务A读取了事务B更新的数据&#xff0c;然后B回滚操作&#xff0c;那么A读取到的数据是脏数据 2、不可重复读&#xff1a;事务 A 多次读取同一数据&#xff0c;事务 B 在事务A多次读取的过程中&#xff0c;对数据作了更新并提交&#x…

eventfd(一)

函数原型&#xff1a; 创建的时候可以传入一个计数器的初始值initval。 第二个参数flags在linux 2.6.26之前的版本是没有使用的&#xff0c;必须初始化为0&#xff0c;在2.6.27之后的版本flag才被使用。 #include <sys/eventfd.h> int eventfd(unsigned int initval, in…

gettimeofday

作用&#xff1a;需要打印代码执行到某处的时间&#xff0c;或者需要计算程序执行的时间差&#xff08;精确到微妙级&#xff09;。这时会用到gettimeofday函数&#xff0c;它可以返回自1970-01-01 00:00:00到现在经历的秒数。 #include <sys/time.h> int gettimeofday(…

1070 结绳 (25 分

给定一段一段的绳子&#xff0c;你需要把它们串成一条绳。每次串连的时候&#xff0c;是把两段绳子对折&#xff0c;再如下图所示套接在一起。这样得到的绳子又被当成是另一段绳子&#xff0c;可以再次对折去跟另一段绳子串连。每次串连后&#xff0c;原来两段绳子的长度就会减…

1072 开学寄语 (20 分)

下图是上海某校的新学期开学寄语&#xff1a;天将降大任于斯人也&#xff0c;必先删其微博&#xff0c;卸其 QQ&#xff0c;封其电脑&#xff0c;夺其手机&#xff0c;收其 ipad&#xff0c;断其 wifi&#xff0c;使其百无聊赖&#xff0c;然后&#xff0c;净面、理发、整衣&am…

1076 Wifi密码 (15 分)

下面是微博上流传的一张照片&#xff1a;“各位亲爱的同学们&#xff0c;鉴于大家有时需要使用 wifi&#xff0c;又怕耽误亲们的学习&#xff0c;现将 wifi 密码设置为下列数学题答案&#xff1a;A-1&#xff1b;B-2&#xff1b;C-3&#xff1b;D-4&#xff1b;请同学们自己作答…

c++如何防止一个类被其他类继承?

如何在防止一个类被其他的类继承呢&#xff1f; 如果是仅仅为了达到这个目的可以直接把这个类的构造函数设置成私有的&#xff0c;这样就杜绝了其他类的继承。也相当于毁掉了这个类&#xff08;无法再创造出自己的对象&#xff09;。 那么怎么样既要保证这个类的完整性&#…

C++中构造函数和析构函数可以抛出异常吗?

不建议在构造函数中抛出异常。当构造函数中抛出异常时&#xff0c;析构函数将不会被执行&#xff0c;需要手动释放内存。析构函数不应该抛出异常。当析构函数中有一些可能发生的异常时&#xff0c;这时候要把可能发生的异常完全封装在析构函数内部&#xff0c;决不能让它抛出到…

1086 就不告诉你 (15 分)

做作业的时候&#xff0c;邻座的小盆友问你&#xff1a;“五乘以七等于多少&#xff1f;”你应该不失礼貌地围笑着告诉他&#xff1a;“五十三。”本题就要求你&#xff0c;对任何一对给定的正整数&#xff0c;倒着输出它们的乘积。 输入格式&#xff1a; 输入在第一行给出两个…

多线程顺序交替打印ABCD

题目&#xff1a;按照 ABCD的顺序交替打印。 1. 测试代码&#xff1a; #include <iostream> #include <unistd.h> #include <stdlib.h> #include <pthread.h> using namespace std;struct {int t;pthread_mutex_t mutex;pthread_cond_t cond; } tes…

1092 最好吃的月饼 (20 分

月饼是久负盛名的中国传统糕点之一&#xff0c;自唐朝以来&#xff0c;已经发展出几百品种。 若想评比出一种“最好吃”的月饼&#xff0c;那势必在吃货界引发一场腥风血雨…… 在这里我们用数字说话&#xff0c;给出全国各地各种月饼的销量&#xff0c;要求你从中找出销量冠军…

1094 谷歌的招聘 (20 分)

2004 年 7 月&#xff0c;谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌&#xff08;如下图&#xff09;用于招聘。内容超级简单&#xff0c;就是一个以 .com 结尾的网址&#xff0c;而前面的网址是一个 10 位素数&#xff0c;这个素数是自然常数 e 中最早出现的 10 位连续…

C++基础:各种输入方法总结

输入原理简述&#xff1a; 程序的输入都建有一个缓冲区&#xff0c;即输入缓冲区。每次输入过程是这样的&#xff0c;当一次键盘输入结束时会将输入的数据存入输入缓冲区&#xff0c;而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的&#xff0c;所以…

03-树1 树的同构 (25 分)

给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2&#xff0c;则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的&#xff0c;因为我们把其中一棵树的结点A、B、G的左右孩子互换后&#xff0c;就得到另外一棵树。而图2就不是同构的。 图1 图2 现给定两棵…

06-图3 六度空间 (30 分)

“六度空间”理论又称作“六度分隔&#xff08;Six Degrees of Separation&#xff09;”理论。这个理论可以通俗地阐述为&#xff1a;“你和任何一个陌生人之间所间隔的人不会超过六个&#xff0c;也就是说&#xff0c;最多通过五个人你就能够认识任何一个陌生人。”如图1所示…