面试题目总结一

问题列表:

问题1:指针常量,常量指针和指向常量的常量指针

指针常量(Pointer to const):不能修改指向变量的值,int const *p
常量指针(const Pointer):不能改变指向,不能指向常量,int *const p
指向常量的常量指针(const Pointer to const):不能改变指向,可以指向常量,const int *const p
其中常量是指不能修改。

问题2:重载、重定义、重写的区别

主要区别:
(1)作用域;
(2)参数列表。

不能重载的情况:
(1)函数只有返回值不同;
(2)语意不明,函数参数列表出现多个匹配。

问题3:构造函数和析构函数调用顺序

构造函数:(类间按照继承顺序构造,成员间按声明顺序)
(1)虚拟基类的构造函数;
(2)非虚拟基类的构造函数;
(3)设定虚函数表指针值;
(4)成员对象的构造函数;
(5)类本身的构造函数。

析构函数:由于采用函数栈的形式,因此,析构顺序与构造顺序相反。

问题4:宏定义中的#,##,#@

(1)#:返回字符串
(2)##:表示子串连接
例如:#define Conn(x,y) x##y
(3)#@:返回const char

问题5:利用memset对vector和string等容器初始化

问题6:C++中指针和引用的区别

  1. 定义和性质区别
    1. 指针:指针是一个变量,存储的是一个内存地址,指向内存的一个存储单元;通过指针获取这个指针指向的内存中的值称为解引用;引用:是原变量的一个别名(同义词),引用跟原来的变量实质上是同一个东西,它保存着所指对象的存储地址,并且使用的时候会自动解引用。int a = 1; int *p = &a;int &s = a; 其中,p是指针变量,该指针变量指向整型变量a的存储单元,即p的值是a存储单元的地址;s是整型变量a的引用,a与b在内存中占用同一存储单元
    2. 引用不可以为空,当被创建的时候必须初始化,而指针可以是空值,可以在任何时候被初始化。
    3. 指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)
    4. 作为参数传递时,指针需要被解引用才可以向对象进行操作,而直接对引用的修改都会改变引用所指向的对象。
    5. 指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;
    6. 指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。
    7. sizeof(引用)得到的是所指向的变量(对象)的大小,而sizeof(指针)得到的是指针本身的大小;
    8. 如果返回动态内存分配的对象或者内存,必须使用指针引用可能引起内存泄漏;
    9. 可以有const指针,但是没有const引用
    10. 指针引用的自增(++)运算意义不一样。
  2. 作为函数参数的区别
    函数使用指针传递参数,可以实现对实参进行改变的目的,是因为传递过来的是实参的地址。
// 函数定义
void swap_int(int *a, int *b){ }  
void test_int(int *p){ } // 传指针
void test_cite(int &a){ } //传引用
void test_int_cite(int *&p) { } // 传指针的引用
int main(){
	int a =1,b = 2;
	int *p = &a; //
	swap_int(&a,&b); //传地址,函数形参*对地址进行取值
	test_int(p); // 传指针变量
	test_cite(a); 
	test_int_cite(a);
 return 0;
}
  1. *a和*b实际上是存储实参的内存单元里的数据,即是对实参进行改变可以达到目的。
  2. test_int函数传递的是地址,只不过传递的是指针的地址(变量的地址)。当把指针作为参数进行传递时,也是将实参的一个拷贝传递给形参,即上面程序main函数中的p和test函数中使用的p不是同一个变量,存储2个变量p的单元也不相同(只是2个p指向同一个存储单元),那么在test_int函数中对p进行修改,并不会影响到main函数中的p的值。如果要想达到也同时修改的目的的话,就得使用引用了.
  3. 引用作为函数参数进行传递时,实质上传递的是实参本身,即传递进来的不是实参的一个拷贝,因此对形参的修改其实是对实参的修改,所以在用引用进行参数传递时,不仅节约时间,而且可以节约空间。
  4. 如果需要同步修改主函数和函数体中的指针变量,就得使用引用。

问题7:直接调用构造函数和使用new操作符的区别

  • 直接调用构造函数
    直接调用构造函数,就和普通函数一样按顺序执行。如果构造函数中创建了属性,这个属性会挂载到调用者this所指向的对象上。不用new,也就是普通的函数调用而已,所以若是函数本身没有返回值,普通的函数调用没有什么意义.
    this关键字的使用:本质来说,是函数内部的特殊变量 是在函数被调用时,保存了所处的作用域;

  • 使用new操作符
    使用new操作符 + 构造函数,在这种方式调用构造函数时,会执行以下几个步骤:
    (1)创建一个新对象;
    (2)将构造函数的作用域赋给这个新对象;(this指针就指向了这个对象)
    (3)执行构造函数中的代码;(为这个新对象添加属性)
    (4)返回这个对象。

  • 区别

    • new创建类对象需要指针接收;
    • new创建类对象使用完需delete销毁;
    • new创建对象直接使用堆(heap)空间,而局部不用new定义类对象则使用栈(stack)空间;
    • 频繁调用场合并不适合new,就像new申请和释放内存一样、
  • 三种创建类对象的方式:
    1、 new创建类对象
    new创建类对象需要类指针接收
    2、不用new,直接使用类定义申明
    3、类指针+new
    (1)先定义类指针,在new之前并未为该类对象分配任何内存空间,因此如果未经过对象初始化则不需要delete释放;
    (2)再使用的时候new。

#include<iostream>

class A {
private:
	int a;
	int b;
public:
	A() {a = 1;b = 2;}
	~A(){}
};

int main()
{
	A* pA = new A(); // tpye 1
	A mA; // type 2
	A* pB = NULL; // type 3
	pB = new A();
	return 0;
}

构造函数返回值的问题(???)
如果一个函数的返回值是引用类型(数组,对象或者函数)的数据,那么这个函数作为构造函数用new运算符执行构造时,运算的结果将被它的返回值取代,这时候,构造函数体内的this值丢失了,取而代之的是被返回的对象;

问题8:代码实现字符串中重复字符和下标的查找

题目描述:给定一字符串,从中找出重复出现的字符,并返回首次重复的下标。
python:

def find_char_in_string(str):
    """
    characters are stored in dictionary
    format of dictionary :
    dict_char = {char : [occurrence number,index]}
    """
    dict_char = {}
    for i, char in enumerate(str):
        if char in dict_char:
            dict_char[char][0] += 1
            dict_char[char].append(i)
        else:
            dict_char.update({char: [1, i]})  # dict_char[char] = [1, i]

    return dict_char


if __name__ == '__main__':
    s = '&acs1234^3123$%^&$#'
    d = find_char_in_string(s)
    
    for key, value in d.items():
        if value[0] > 1:
            print("{}:{}".format(key, value[2]))

C++:

#include <iostream>
#include <vector>
#include <map>
#include <string>

using namespace std;

void count_char_in_string(string s, map<char, vector<int>> &m)
{

	
	for (int i = 0; i < s.length(); i++)
	{
		map<char, vector<int>> ::iterator it = m.begin();
		if (!m.count(s[i]))
		{
			vector<int> index; //index[0] is occurrence number,[1]、[2]...is index;
			index.push_back(1); 
			index.push_back(i);
			m.insert({ s[i], index });
		}
		else {
			it = m.find(s[i]);
			it->second.push_back(i);
			it->second[0]++;
		}
	}
}

int main()
{
	string str = "&acs1234^3123$%^&$#";;
	map<char, vector<int>> map_char;

	count_char_in_string(str, map_char);
	
	return 0;
}

问题9:Python中logging库的使用

问题10:设计模式方面

问题11 :QT方面

问题12 :嵌入式boot方式

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C和Qt是两种常用的编程语言,而ROS(机器人操作系统)是一种开源的软件框架。我假设这个面试题是要求讨论如何在使用Qt编写ROS应用程序使用C/C++语言。 首先,Qt可以与ROS结合使用,因为Qt提供了良好的图形用户界面(GUI)和多线程处理的能力,而ROS则提供了机器人开发所需的各种功能库和工具。在使用Qt编写ROS应用程序时,我们可以按照以下步骤进行: 1. 安装Qt和ROS:首先,需要安装Qt和ROS的开发环境。Qt可以从其官方网站下载并安装,ROS可以通过相关的命令行工具进行安装。安装完成后,我们可以开始编写Qt与ROS集成的应用程序。 2. 连接ROS和Qt:通过在Qt应用程序包含ROS的头文件和库文件,我们可以将两者连接起来。在Qt项的.pro文件添加相关的ROS库文件路径,然后使用#include来引入ROS的头文件,就可以在Qt应用程序使用ROS的功能了。 3. 创建ROS节点:在Qt应用程序创建一个ROS节点,这样我们就可以使用ROS的通信机制(如发布和订阅话题,调用服务等)与其他ROS节点进行通信。可以使用Qt提供的多线程处理机制来处理ROS节点的功能,以实现异步处理和更好的性能。 4. 使用ROS功能:在Qt应用程序,可以使用ROS的各种功能,例如获取传感器数据、控制机器人动作、进行位姿估计等。通过ROS的相关API,我们可以访问ROS节点和话题,以实现对机器人的控制和感知。 总结来说,使用C/C++编写Qt应用程序,并与ROS集成,可以实现机器人应用程序的开发。在这个过程,我们可以利用Qt的强大图形界面和多线程处理能力来实现用户友好的界面和高效的数据处理,而ROS框架则为我们提供了机器人开发所需的功能库和工具。这种结合可以在机器人应用开发提供更好的开发体验和更高的灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值