记:应聘 新晨科技 C++工程师

笔试

逻辑题+java基础。逻辑题做的不错,java基础就凉凉。。

电话面

不过,虽然java笔试题做的菜。但还是给了电话面的机会。电话面的内容,真的和面试官说的一样,都是计算机基础,包括cpu,内存与外存,冒泡排序,快速排序,栈与队列,以及一些数据库的简单操作等。

第二轮电话面

提前做的一点准备:
1.进程通信,按照交换信息的多少和效率的高低,进程通信分为低级通信和高级通信。
低级通信的传送信息量小,效率低,每次传送的信息量固定。主要方式有信号量,通过P、V操作来改变值。
相对应的高级通信,其效率更高,传送的信息量更大,
主要有三种方式:共享内存模式,最为快捷有效的方式之一,UNIX系统中常被使用。
消息传递模式,分为直接通信方式:点到点的发送和间接通信方式(信箱命名法)。
管道通信模式。是一种信息流缓冲机构, UNIX系统中管道基于文件系统,在内核中通过文件描述符表示。管道以先进先出(FIFO)方式组织数据传输。百度百科,进程通信
2.套接字(socket),是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。
在网络应用程序设计时,由于TCP/IP的核心内容被封装在操作系统中,如果应用程序要使用TCP/IP,可以通过系统提供的TCP/IP的编程接口来实现。在Windows环境下,网络应用程序编程接口称作Windows Socket。为了支持用户开发面向应用的通信程序,大部分系统都提供了一组基于TCP或者UDP的应用程序编程接口(API),该接口通常以一组函数的形式出现,也称为套接字(Socket)。百度百科,套接字
3.左连接,右连接。
右连接:RIGHT JOIN 关键字会从右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。
左连接:LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
听着就和天书一样,啥意思呢?举个例子。(来自W3school的教程)
左连接右连接讲的很清楚了,我自己的理解就是,如果是左连接的话,以左边的表格为主,把它的数据都要在结果中呈现出来,然后,对于右边的表,按照设置的条件来处理。右连接,反之。

下午三点接到电话了。这里记录一下一些题目。
1.const关键字。
1)关于const修饰指针。

int a = 1;
int b = 2;
const int* p1 = &a;
  //p1是一个指针,指向一个int型对象,该对象是一个常量。即指针指向的对象是一个常量。
int* const p2 = &a;
//p2是常量,p2是一个指向int型的指针,即指针本身是一个常量。

2)关于const修饰普通变量
该教程的第一部分
3)const参数传递和函数返回值
const修饰参数可以防止传进来的值被修改。一般如果传进来的值是自定义类型的变量,还会配合使用引用,避免传进来的时候调用构造函数,需要花费较多的资源。
const做为函数返回值的时候,略。
4)const修饰类成员变量

/*
验证const修饰类成员函数。代码来自菜鸟教程
2020.3.21 13:55
*/
#include<iostream>
using namespace std;
class Test
{
public:
    Test() {}
    Test(int _m) :_cm(_m) {}
    int get_cm()const    //定义为const的。
    {
        return _cm;
    }
private:
    int _cm;
};
void Cmf(const Test& _tt)
{
    //_tt是const修饰的。
    //所以为了使编译器不认为函数会改变_tt的值。
    //函数也需要定义为const的。
    cout << _tt.get_cm();
}
int main(void)
{
    Test t(8);
    Cmf(t);
    return 0;
}
/*
验证mutable关键字。
*/
#include<iostream>
using namespace std;
class Test
{
public:
    Test(int _m, int _t) :_cm(_m), _ct(_t) {}
    void Kf()const
    {
        //++_cm; // 错误
        //_ct是使用mutable修饰的。可以改变。这个关键字提供了在const函数里面改变变量值的方法。
        ++_ct; // 正确
    }
    //void Kf()
    //{
    //    ++_cm; // 没加const的时候,_cm是可以改变的。
    //    ++_ct; // 正确
    //}
    int get_cm()const    //定义为const的。
    {
        return _cm;
    }
    int get_ct()const    //定义为const的。
    {
        return _ct;
    }
private:
    int _cm;
    mutable int _ct;
};
void Cmf(const Test& _tt)
{
    cout << _tt.get_cm() << endl;
    cout << _tt.get_ct();
}
int main(void)
{
    Test t(8, 7);
    t.Kf();
    Cmf(t);
    return 0;
}

2.strlen()和sizeof()的区别。
这篇文章提到了char []字符串和string 字符串的区别。
sizeof()取的是字节数。
3.static关键字。
①.隐藏:static可以用作函数和变量的前面可表示隐藏。对于函数来讲,static的作用仅限于隐藏。
②.周期不同:存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围。如果作为static局部变量在函数内定义,它的生存期为整个源程序,但是其作用域仍与局部变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
③.自动初始化为0:其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加‘\0’;太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是‘\0’。
④在类中声明static变量或者函数时,初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员,这样就出现以下作用:
(1)类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致了它仅能访问类的静态数据和静态成员函数。
(2)不能将静态成员函数定义为虚函数。
(3)由于静态成员声明于类中,操作于其外,所以对其取地址操作,就多少有些特殊,变量地址是指向其数据类型的指针 ,函数地址类型是一个“nonmember函数指针”。
(4)static并没有增加程序的时空开销,相反她还缩短了子类对父类静态成员的访问时间,节省了子类的内存空间。
(5)静态数据成员是静态存储的,所以必须对它进行初始化。
(6)静态成员初始化与一般数据成员初始化不同:
\quad 初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆;
\quad 初始化时不加该成员的访问权限控制符private,public等;
\quad 初始化时使用作用域运算符来标明它所属类;
\quad <数据类型><类名>::<静态数据成员名>=<值>
4.主键和索引的区别。
\quad 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。
\quad 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。
\quad 唯一性索引列允许空值,而主键列不允许为空值。

后续

1.hr面的电话说明了基本的待遇情况:外包合同。具体私聊。
2.大概的意思是给offer了。
3.需要培训大约2-3个月。培训期分为两个步骤,第一步骤,20元/天;合格进第二步骤,100元/天。
4.其他私聊。

原创文章 77 获赞 4 访问量 9038

猜你喜欢

转载自blog.csdn.net/weixin_40007143/article/details/104971100