华为选择题总结
以下为面试被问到的题
1. 友元类,友元函数
2. 构造函数和析构函数能抛出异常吗,如果带指针的抛出异常怎么办:
答:构造函数可以抛出异常,但是存在内存泄漏奉献,如果构造函数中有指针的内存分配,由于构造函数中抛出了异常,等价于该类并没有成功实例化,因此不会自动调用构造函数,此时可以用智能指针unique_ptr来定义指针。
3. 排序算法
4. 单例模式+多线程
5. python提高效率的方法
6. 图和树的区别
7. list和tuple区别:
- 定义形式不同 list=[1,2,3], tuple=(1,2,3)
- tuple由于采用的是括号定义,所以当内部只有一个元素时,为了避免歧义,元素后面需要加一个
,
,如a=(1,), 而不是a=(1)。 - tuple一旦定义不可修改,因为数据存储更安全。list是可以修改的,通过append, pop(n), insert操作等。
- tuple 内部元素如果包括列表,那么也是可变的
a=('a','b',[1,23])
T=a[2]
T[0]=2
T[1]=4
print(a)
# (‘a’,'b',[2.4])
8. python 传参是值传递还是传引用
9. 字典和列表推导式是什么
可以快速生成字典和列表数据
(1)列表
- 基础推导式:a=[for i in xxx]
- 推导式结合if 进行过滤[for x in xx if 过滤条件]
- 推导式结合三目运算符进行赋值[if 条件 else 输出值 y for x in xxx],if条件为真时输出x,否则输出y
- 三目运算符扩展
num=int(intput("Input a number"))
number=100 if num>5 else 0
(2)字典
{i:v for i,v in enumerate(list)}
{key:value for key, value in dict.item()}
a=['Nancy','Victor','Tom','Jenny']
b={i:v for i,v in enumerate(a)}
c={i:a[i] for i in range(len(a))}
# Apply the derived type and zip() function to output a dict
age=[15,17,19,20]
d={k:v for k,v in zip(a,age)}
print(b,'\n')
print(c,'\n')
print(d,'\n')
# {0: 'Nancy', 1: 'Victor', 2: 'Tom', 3: 'Jenny'}
# {0: 'Nancy', 1: 'Victor', 2: 'Tom', 3: 'Jenny'}
# {'Nancy': 15, 'Victor': 17, 'Tom': 19, 'Jenny': 20}
10. 什么是PEP8
11. Python id()函数
返回对象的唯一标识符,标识符是一个整数。
a='runoob'
b=1
print(id(a))
print(id(b))
# 140024298019152
# 140024298092848
1. 如何打印当前源文件的文件名以及源文件的当前行号?
cout<<__FILE__;
cout<<__LINE__;
以上两个是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定义的。
2. 当一个类中没有任何成员变量和函数时,sizeof大小为多少
答: 为1,这和sizeof(void)是相同的,必须给定占个文职,而分配空间最小单位为1。
3. 构造函数可否为虚函数
答:不可以,因为实例化一个类变量时,一定会指明其类型,而不是像某些多态的虚函数一样,运行时才识别确定。基类的析构函数一定要是虚函数。
4. 函数模板与类模板的区别
答:函数模板为隐式实例化,编译器可以根据实参类型推断其实际类型。类模板为显示实例化,必须指明其所使用的类型。
template<class T>
void Swap(T& a1,T& a2){
T tmp=a1;
a1=a2;
a2=tmp;
}
template<class T>
class A{
A& fun();
A value;
};
int main(){
doubel d1=1.1;
doubel d2=2.2;
Swap(d1,d2);
int c1=2;
int c2=10;
Swap(c1,c2);
A<int> a;
return 0;
}