程序内存分布,全局变量、静态变量的存储位置
static修饰符作用
static全局变量跟普通全局变量区别,存储方式有何区别c++设计一个单例模式,多线程环境下如何设计?用线程锁是否会影响性能?有其他方案吗介绍下c++ socket 模型, 建立tcp连接的步骤。多线程同步方式有哪些进程、线程的区别进程间有哪些通信方式,各自优点是什么。
拷贝构造函数参数为何必须为引用
笔试题量很大,可惜很多没记住。大概讲下有印象的考点:
数据库方面考了很多,有很多我都没听过。
inner join,outer join,索引
软件工程知识也不少,还有敏捷开发
32位机上编译的 sizeof(char*),64位机子上输出什么?这题我觉得Linux上运行不了,win可以,但是我没有32位机子,没法测试,有人知道吗?
异或运算
短小常用函数在c里用什么代替,c++里用什么代替
char* const p和char const * p的区别
这题说一个我的记忆方法:把*视为point to,然后从后往前读,比如
char const * p就是p piont to a const char
char* const p就是p is const which point to a char
const char* p就是p point to a char which is const
所以char const * p和const char* p的意义是一样的,p指向的内存不可变,char* const p的意义是p本身的值不可变。
构造函数内调用另一个构造函数
class A {
int m_age;
string m_name;
public:
A(const int& age){
A(age, "");
}
A(const int& age, const string& name) : m_name(name), m_age(age){}
};
在java等平台支持语言中这种写法比较常见,但在c++中语法是没问题,但是结果肯定不是你想要的。
A(const int& age){
A(age, "");
}
在 A(const int& age)内调用A(age, ""),在栈上构造了另一个匿名A对象,然后函数返回,匿名对象被销毁,然而当前对象成员却没有被初始化,成员值随机。如果非要这样写来达到重用代码,可以这样写
A(const int& age) {
new (this)A(age, "");
}
c11及以上支持在初始化列表中调用另一个构造函数,不能写在函数体内。如
class A {
int m_age;
string m_name;
public:
A(const int& age) : A(age, "") {}
A(const int& age, const string& name) : m_name(name), m_age(age){}
};
需要注意的是,被调用的构造函数必须完整初始化所有成员。所以A(const int& age) 可以调用A(const int& age, const string& name),而反过来不行。
编程题:
1. 实现单项链表反转,只允许遍历一次。
2. 两个字符串,实现判断其中一个是不是另一个的子串,区分大小写,同时还要写test case
3. 传入6个字节长度的旧密码、新密码、再次输入的新密码三个字符串指针,然后判断是否符合以下规则:
新密码不能跟旧密码相同,两次输入的新密码要相同,密码为6位长度的数字的字符,新密码不能是123456或654321这样的有序数字或是666666这样的同一个数字。
关键是这题代码只能在for循环里里填
int changePasswdIsOk(char* Old, char* New, char* New2) {
if (Old == NULL || New == NULL || New2 == NULL)
return 0;
for (int i = 0; i < 6; i++) {
}
}
本来看到这种题,一般会在循环外定义标志位用来保存上一次的状态,然后与下次循环判断结果相与,但是这题要求只能在循环内写代码,当时是有一点点思路的,就是在循环内创建静态标志位,但是想着想着最后还是要在循环外判断最终结果才能返回最终结果,时间又紧,下场面试的人已经在催了,就放弃了。回到家中还是没啥思路,想百度也不知道搜什么关键词,后来又想了想,写出来了:
bool changePasswdIsOk(const char Old[], const char New[], const char New2[]) {
if (Old == NULL || New == NULL || New2 == NULL)
return false;
for (int i = 0; i < 6; i++) {
static bool EachIsSame = true;
static bool isOrderedInc = true;
static bool isOrderedDec = true;
static bool isSameWithOld = true;
if (New[i] != New2[i])
return false;
if ('0' > New[i] || '9' < New[i])
return false;
if (isSameWithOld && New[i] != Old[i])
isSameWithOld = false;
if (i < 5) {
if (EachIsSame && New[i] != New[i + 1] )
EachIsSame = false;
if (isOrderedInc && New[i] != New[i + 1] - 1)
isOrderedInc = false;
if (isOrderedDec && New[i] != New[i + 1] + 1)
isOrderedDec = false;
}
else
return !(isSameWithOld || EachIsSame || isOrderedInc || isOrderedDec);
}
return true;
}
测了下都通过了。
上上周五去二面了,之前接到二面通知还挺高兴的,还以为过了一面,结果好像去了一面的人都去二面了。然后所有岗位的就两个面试官轮着面,其中一个还是HR。我还是第一次遇到这样的,不知怎么形容。
二面HR问我的核心卖点是什么,问以前单位离职原因,问期望薪资。技术让我挑一个最值得讲的项目讲,然后问我最大的难点在哪。后来问,有一个很大的文件,比如一个G,要怎么传比较好。我说切成多片,多线程传输。他感觉不是很满意。但也没说应该怎么传。后来我问了几个朋友,也都说会切片传输。算上那个可有可无的心理测试,等了快有一个半小时,然后面试十分钟不到就灰溜溜的回去了,当然之后也没后续了。