面向对象程序设计--模拟题2查漏补缺

选择-友元

下列关于 友元 的说法,正确的是

A. 友元关系可继承

B. 友元函数必须是成员函数

C. 友元可访问类的私有成员,但破坏封装需谨慎使用

D. 友元声明只能写在类外

选C

  • A 错:友元关系不能继承

  • B 错:友元函数不一定是成员函数,很多友元函数本来就是类外普通函数

  • C 对:友元可以访问类的私有成员,但会削弱封装性,应谨慎使用

  • D 错:友元声明通常写在类内

选择-运算符重载

下列哪项属于运算符重载限制

A. 不能重载 +

B. 不能改变运算符的优先级与结合性

C. 重载后可把二元运算符变成三元

D. 运算符重载只能写成成员函数

选B

  • A 错:+ 可以重载

  • B 对:不能改变运算符的优先级和结合性

  • C 错:不能把二元运算符重载成三元

  • D 错:运算符重载既可以写成成员函数,也可以写成非成员函数(常配合友元)

填空-虚析构

  1. 若基类指针删除派生类对象,为保证派生类析构被调用,基类析构函数应声明为

virtual 析构函数

填空-常指针

  1. const 成员函数中,隐含的 this 指针类型等价于:

const Point * const 指针指向和指针的值都不可修改

**简答题-**静态联编 vs 动态联编

说明"静态联编 vs 动态联编"的触发条件、典型代码形态与各自优缺点

1. 静态联编

静态联编也叫早绑定 ,在编译期就确定调用哪个函数。

触发条件

  • 调用普通函数

  • 调用非虚成员函数

  • 重载函数的匹配

  • 模板实例化后的调用

典型代码形态

cpp 复制代码
class Base{
public:
void show(){ cout << "Base\n"; }
};

int main(){
Base b;
b.show(); // 编译期确定
}

优点

  • 调用效率高

  • 编译器容易优化

  • 实现简单

缺点

  • 灵活性差

  • 不能体现运行时多态


2. 动态联编

动态联编也叫晚绑定 ,在运行期根据对象的真实类型决定调用哪个虚函数。

触发条件

必须同时满足:

  1. 基类中该函数是 virtual

  2. 通过 基类指针或基类引用

  3. 实际绑定的是 派生类对象

典型代码形态

cpp 复制代码
class Base{
public:
    virtual void show(){ cout << "Base\n"; }
};

class Derive : public Base{
public:
    void show() override { cout << "Derive\n"; }
};

int main(){
    Base *p = new Derive;
    p->show();   // 运行期决定,输出 Derive
    delete p;
}

优点

  • 支持运行时多态

  • 扩展性强

  • 更符合面向对象设计

缺点

  • 有一点运行时开销

  • 需要虚函数表等机制

  • 代码理解难度略高

程序改错-const

程序填空-菱形继承

代码题

cpp 复制代码
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;

class Date{
private:
    int y, m, d;
public:
    Date(int yy = 0, int mm = 0, int dd = 0): y(yy), m(mm), d(dd) {}

    void Print(ostream &out) const{
        out << y << "-"
            << setw(2) << setfill('0') << m << "-"
            << setw(2) << setfill('0') << d;
    }
};

class Person{
private:
    string name;
    Date birthday;   // 子对象
public:
    Person(const string &n, const Date &b): name(n), birthday(b) {}

    void Print(ostream &out) const{
        out << name << " ";
        birthday.Print(out);
    }
};

void Show(const Person &p){
    p.Print(cout);
}

int main(){
    string name;
    int y, m, d;
    cin >> name >> y >> m >> d;

    Date birth(y, m, d);
    Person p(name, birth);

    Show(p);
    return 0;
}
相关推荐
艾莉丝努力练剑21 分钟前
【Linux网络】Linux 网络编程:HTTP(五)HTTP收尾,从Cookie会话保持、抓包问题到 HTTPS 初识
linux·运维·服务器·网络·c++
Shadow(⊙o⊙)21 分钟前
前缀和:和可被K整除的子数组(normal)
数据结构·c++·算法
努力努力再努力wz33 分钟前
【Redis入门系列】:Redis 内部编码机制与 String 深度解析:SDS 底层实现、三种编码与核心命令详解
c语言·开发语言·数据结构·数据库·c++·redis·缓存
Brilliantwxx35 分钟前
【C++】 认识STL set与map(基础接口+题目OJ运用)
开发语言·数据结构·c++·笔记·算法
05候补工程师37 分钟前
【线性代数】核心考点复习笔记:二次型配方法、施密特正交化步骤与特征值经典题型详解
经验分享·笔记·线性代数·考研·算法
Huangjin007_37 分钟前
【C++ STL篇(十一)】深入浅出红黑树:从原理到实现,一篇搞定
开发语言·c++
fqbqrr39 分钟前
2605C++,C++继承类实现调试器
开发语言·c++
海清河晏11142 分钟前
数据结构 | 循环队列
数据结构·c++·visual studio
Shadow(⊙o⊙)1 小时前
Linux基础IO-1.0——open、close、read及write-深入手搓分析!
linux·运维·服务器·开发语言·c++·学习
小小de风呀1 小时前
de风——【从零开始学C++】(九)—vector的基本使用
开发语言·c++