• 【笔试题】【day8】


    目录

    第一题(函数重载)

    第二题(调用拷贝构造的情况) 

    第三题(拷贝构造函数的次数问题)

    第四题(友元函数重载运算符的相关问题)

    第五题(构造和析构函数的顺序)


    第一题(函数重载

    关于重载函数,哪个说明是正确的()

    A 函数名相同,参数类型或个数不同
    B 函数名相同,返回值类型不同
    C 函数名相同,函数内部实现不同
    D 函数名称不同

    函数重载:在相同的作用域中,函数名字相同,参数列表不同的一些列函数称为函数重载。

    参数列表不同具体的体现:参数个数不同,参数类型不同,类型的次序不同

    注意:函数返回值类型是否相同没有关系。和函数内部的实现没有关系。

    A

    第二题(调用拷贝构造的情况) 

    下列情况中,不会调用拷贝构造函数的是()

    A 用一个对象去初始化同一个类的另一个新对象时
    B 将类的一个对象赋值给该类的另一个对象时
    C 函数的形参对象,调用函数进行形参和实参结合时
    D 函数的返回值是类的对象,函数执行返回调用时

    概念:是一个特殊的构造函数,是单参的,参数的类型必须是类类型&一般情况下会使用const来进行修饰。 A(const A&a)

    调用时机:当用已经存在的队形构造新的对象的时候,编译器会自动地调用拷贝构造函数
     

    1. A a1;
    2. A a2(a1); //拷给构造函数
    void Func(A a)//在传参时也会调用拷贝构造函数
    1. A Fun()
    2. {
    3. A a;
    4. //这个返回的a也是拷贝构造
    5. return a;
    6. }

    B:a1=a2注意:其中调用的是赋值运算符重载。这个a1并不是新创建的,而是之前就已经存在的,所以是赋值运算符重载,仅仅是将a2的值拷贝给a1

    B

    第三题(拷贝构造函数的次数问题)

    以下代码共调用多少次拷贝构造函数:

    1. Widget f(Widget u)
    2. {
    3. Widget v(u);
    4. Widget w=v;
    5. return w;
    6. }
    7. main(){
    8. Widget x;
    9. Widget y=f(f(x));
    10. }

    A 1

    B 3
    C 5
    D 7

    y对象的构造将来也需要调用构造函数。

    y=f(f(x))我们先需要调用内部的这个f(x),这个内部的x传递给f函数的u,调用了一次拷贝构造函数,然后用u来拷贝构造v,就是两次拷贝构造函数,然后用来拷贝构造w(这里并不是赋值运算符的重载,因为是用已经存在的对象创建新的对象),也就是第三次拷贝构造。然后w在返回的时候需要构造一个临时的返回对象,又调用了一次拷贝构造,也就是第四次拷贝构造。然后这个内部的f(x)的拷贝构造就完成了。然后我们将这个内部的临时对象再传给我们的u,也就是第五次拷贝构造,然后u拷贝构造生成了v,是第六次拷贝构造,然后再用v构造w就是第七次拷贝构造,然后再w返回的时候,又需要创建一个临时对象进行返回,也就是第八次拷贝构造,然后用这个临时变量的返回值返回给y,也就是创建了y这个对象,也就是需要九次拷贝构造

    但是这里是没有九这个选项的。

    注意:当函数返回值是一个类类型对象时,编译器可能会对返回值类型进行优化,所以就不生成这个返回的临时的返回对象,而是直接将这个w返回,也就是优化了两次,所以是七次

    D

    第四题(友元函数重载运算符的相关问题)

    如果友元函数重载一个运算符时,其参数表中没有任何参数则说明该运算符是()

    A 一元运算符
    B 二元运算符
    C 选项A)和选项B)都可能
    D 重载错误

    当用户定义了一个类之后,然后先要通过该类的对象直接使用某种运算符--编译器是不支持的。

    原因:类对象中可能有多个成员,在用该类的对象进行响应的运算符操作时,该如何处理,编译器是不知道的。

    比如 Date类有两个对象d1 d2

    我们想知道这两个日期的时间差d1-d2,我们的编译器其实并不知道如何计算,这时候我们就需要将运算符进行重载

    运算符重载:

    1.重载成类的成员函数--性参数目看起来比该运算符需要的参数少了一个(因为成员数有隐藏的this)

    2.重载成类的友元函数 (必须有一个参数是类类型的对象)

    (下面的代码取自我们这篇博文中第二部分的内容)

    C++【类和对象】【三】_桜キャンドル淵的博客-CSDN博客

     

    所以我们题目中的参数表中没有任何的参数,所以重载就直接报错了。

    第五题(构造和析构函数的顺序)

    在main 函数中,变量 a 和 b 的构造函数和析构函数的调用顺序是()

    1. class A;
    2. class B;
    3. int main() {
    4. A a;
    5. B b;
    6. return 0;
    7. }

    A b构造 - a构造 - a析构 - b析构
    B a构造 - a析构 - b构造 - b析构
    C b构造 - a构造 - b析构 - a析构
    D a构造 - b构造 - b析构 - a析构

    我们构造的对象是在栈上的,也就是说,我们的a先构造了,然后b再构造,然后析构的时候,由于我们栈的特性,先进入的后出,后进入的先出,所以我们的b先析构,然后再a析构

  • 相关阅读:
    HOT100打卡—day11—【贪心】—最新9.5(剩3题)
    【电商运营】在节日期间,这几个营销误区一定要避免!
    阿里云国际站:阿里云Linux系统磁盘扩容操作实例
    论文选题和论文题目的区别?
    网络安全-pikachu之文件上传漏洞2
    2022高教杯思路合集!!全国大学生数学建模竞赛
    《认知盈余》核心摘要——“人们实际上很喜欢创造并分享”: 参与是一种行为
    springboot+小区公共停车位管理 毕业设计-附源码201517
    目标检测—YOLO系列(二 ) 全面解读复现YOLOv1 PyTorch
    SpringMVC之注册/登录/发送JSON
  • 原文地址:https://blog.csdn.net/weixin_62684026/article/details/127413215