2020 春招 校招 c++笔试总结

1.浩鲸云 笔试35个选择题加3个编程题,答的惨不忍睹,回忆一下还记得的然后做个总结
1.1选择题
1.1.1c++是绝对类型安全的吗
类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域。“类型安全”常被用来形容编程语言,其根据在于该门编程语言是否提供保障类型安全的机制;有的时候也用“类型安全”形容某个程序,判别的标准在于该程序是否隐含类型错误。类型安全的编程语言与类型安全的程序之间,没有必然联系。好的程序员可以使用类型不那么安全的语言写出类型相当安全的程序,相反的,差一点儿的程序员可能使用类型相当安全的语言写出类型不太安全的程序。绝对类型安全的编程语言暂时还没有。
C++的类型安全

如果C++使用得当,它将远比C更有类型安全性。相比于C,C++提供了一些新的机制保障类型安全:

(1)操作符new返回的指针类型严格与对象匹配,而不是void*;

(2)C中很多以void*为参数的函数可以改写为C++模板函数,而模板是支持类型检查的;

(3)引入const关键字代替#define constants,它是有类型、有作用域的,而#define constants只是简单的文本替换;

(4)一些#define宏可被改写为inline函数,结合函数的重载,可在类型安全的前提下支持多种类型,当然改写为模板也能保证类型安全;

(5)C++提供了dynamic_cast关键字,使得转换过程更加安全,因为dynamic_cast比static_cast涉及更多具体的类型检查。

即便如此,C++也不是绝对类型安全的编程语言。如果使用不得当,同样无法保证类型安全。如使用void空类型指针或对两种类型的指针进行强制转换。
1.1.2 c++不可重载的运算符?
. :成员访问运算符
.
, ->*:成员指针访问运算符
:: :域运算符
sizeof:长度运算符
?: 条件运算符
#:预处理符号
1.1.3 c++中内联函数和模板函数都是延迟编译的吗
每个函数模板实际上要被编译两次,一次是在实例化之前,先检查函数模板本身,检查语法是否正确。另一次是在实例化期间,结合所使用的参数类型,再次检查模板代码,查看是否所有的调用都有效。但是要注意只有第二次编译时才会产生真正二进制的机器指令。作为第一次编译的结果,仅仅是在编译器内部形成一个用于描述该函数模板的数据结构,即多为模板内部表示,这种对模板函数的特出处理称为延迟编译。
内联展开发生在编译阶段中。
1.1.4 构造函数与析构函数的调用顺序
构造函数先调用基类的再调用派生类的,析构函数先调用派生类的再调用基类的。
1.1.5 哪个函数可以是虚函数。 a.自定义构造函数 b.拷贝构造函数c.友元函数 d.默认等号操作赋值符
https://blog.csdn.net/judgejames/article/details/87914127
不能声明为虚函数的函数
一.不能被继承的函数 二.不能被重写的函数
1)普通函数

普通函数不属于成员函数,是不能被继承的。普通函数只能被重载,不能被重写,因此声明为虚函数没有意义。因为编译器会在编译时绑定函数。

而多态体现在运行时绑定。通常通过基类指针指向子类对象实现多态。

2)友元函数

友元函数不属于类的成员函数,不能被继承。对于没有继承特性的函数没有虚函数的说法。

3)构造函数

首先说下什么是构造函数,构造函数是用来初始化对象的。假如子类可以继承基类构造函数,那么子类对象的构造将使用基类的构造函数,而基类构造函数并不知道子类的有什么成员,显然是不符合语义的。从另外一个角度来讲,多态是通过基类指针指向子类对象来实现多态的,在对象构造之前并没有对象产生,因此无法使用多态特性,这是矛盾的。因此构造函数不允许继承。

4)内联成员函数

我们需要知道内联函数就是为了在代码中直接展开,减少函数调用花费的代价。也就是说内联函数是在编译时展开的。而虚函数是为了实现多态,是在运行时绑定的。因此显然内联函数和多态的特性相违背。

5)静态成员函数

首先静态成员函数理论是可继承的。但是静态成员函数是编译时确定的,无法动态绑定,不支持多态,因此不能被重写,也就不能被声明为虚函数。
1.1.6类C是以多重继承的方式从类A和类B继承而来的,类A和类B无公共的基类,那么()
A. 可改用单继承的方式实现类C的功能。
B. 类A类B只少有一个是虚基数
C. 类C的继承方式只能采用Public继承
D. 类A和类B至少有一个是抽象类。
类A和类B没有公共的基类,排除B选项
C、D选项太绝对。
只剩下A选项了。
虚基类 是相对于它的派生类而言的,它本身可以是一个普通的类。
只有它的派生类虚继承它的时候,它才称作虚基类,如果没有虚继承的话,就称为基类。比如类B虚继承于类A,那类A就称作类B的虚基类,如果没有虚继承,那类B就只是类A的基类。
虚继承主要用于一个类继承多个类的情况,避免重复继承同一个类两次或多次。
由类A派生类B和类C,类D又同时继承类B和类C,这时候类D就要用虚继承的方式避免重复继承类A两次。
在C++中引入虚基类的目的在于消除类继承层次中出现的“二义性”问题;所谓“二义性”
抽象类

  1. 是指带有有一个或一个以上的纯虚函数的类。抽象类一般值用于继承,不能定义类对象,但可以定义类指针和引用。
  2. 包含有“纯虚函数”的类就是抽象类。它是一种特殊的类,不能直接定义对象,只有通过子类派生并实现它其中的纯虚函数,它才能真正使用!
  3. 书本原语“抽象类刻画了一组子类的操作接口的通用语义,这些语义也传给子类。一般而言,抽象类只描述这组子类共同的操作接口,而完整的实现留给子类”。

1.1.7 float a+b+c==(a+c)+b==(c+a)+b
由于储存精度问题,等式并不相等
1.1.8 对于一个类中的函数int qq(int aa, int bb){a=aa–;b=a*bb;},现在调用qq(4,5)问类中a,b的值
aa–返回aa;–aa返回aa-1;
1.1.9使用流进行输入输出,哪一个可以用来输出 a.cerr b.cin c.cout d.clog
1.1.10哪一个关键字可以用来修饰类中的函数 public register volatile
用关键字volatile声明变量,是用来告诉编译器每次对此变量的引用都需要从内存地址中读取,即取消编译器对此变量的优化编译。
当对一个变量频繁读写时,需要反复访问内存,从而花费大量的存取时间。为此,C语言提供了一种寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写,从而提高了效率。对于循环次数较多的循环控制变量及循环体内反复使用的变量,均可以定义为寄存器变量。
1.1.11那种类是存在但不可获知 外部类
1.1.12实参调用了地址,那么实参和形参
a.形参是实参的备份 b.实参是形参的备份 c.实参和形参是同一对象
1.2编程题
1.2.1手动实现String的四个函数 生成字符串“test”并输出
1.2.2将一串16进制的字符串转换为10进制的数字并输出

    string sw;
    cin>>sw;
    int y=0;
    for(int i=0;i<sw.size();i++){
        if(sw[i]<='9'&&sw[i]>='0'){
            y*=16;
            y+=sw[i]-'0';
        }
        else if(sw[i]<='f'&&sw[i]>='a'){
            y*=16;
            y+=sw[i]-'a'+10;
        }
        else if(sw[i]<='F'&&sw[i]>='A'){
            y*=16;
            y+=sw[i]-'A'+10;
        }
    }
    cout<<y;
    return 0;
}

1.2.3编程判断并输出这段代码是由c++编译器编译的还是c编译器编译的

int main(){

#ifdef __cplusplus
    cout<<"c++";
#else
    cout<<"c";
#endif
 
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值