找回密码
 立即注册
搜索
热搜: 活动 交友
楼主: Ray

面向对象程序设计复习贴

[复制链接]

44

主题

132

回帖

5432

积分

版主

积分
5432
 楼主| 发表于 昨天 19:24 | 显示全部楼层
楼主有点复习不下去了,立一下flag,今天晚上把notes.pdf看完,再把NoughtQ的笔记过一遍。明天开始刷历年考卷,在楼内整理思绪和错题。

44

主题

132

回帖

5432

积分

版主

积分
5432
 楼主| 发表于 昨天 20:49 | 显示全部楼层
// MyClass.h
class MyClass {
private:
    static int counter = 0; // 行 A
public:
    static void show() { std::cout << counter << std::endl; }
};


// main.cpp
#include "MyClass.h"
int main() { MyClass::show(); }


行 A(static int counter = 0;)在类定义内部是不合法的。
应当在类外(通常是 .cpp 文件)单独定义一次,分配存储空间。



44

主题

132

回帖

5432

积分

版主

积分
5432
 楼主| 发表于 昨天 20:53 | 显示全部楼层
S::func(int a) 中三条语句分别访问的是哪个 a?


int a = 100; // 全局变量


class S {
private:
    int a = 10; // 成员变量
public:
    void func(int a) { // 形参
        ::a++;   // 语句 1
        this->a++; // 语句 2
        a++;     // 语句 3
    }
};

答案:全局 成员变量 形参


44

主题

132

回帖

5432

积分

版主

积分
5432
 楼主| 发表于 昨天 20:54 | 显示全部楼层
这几天本来应该减肥的,但是越复习越饿,把房间里的零食差不多吃完了...

44

主题

132

回帖

5432

积分

版主

积分
5432
 楼主| 发表于 昨天 21:34 | 显示全部楼层
典型的默认参数与构造函数冲突一则


class A {
public:
    A() { value = 0; }
    A(int x = 10) { value = x; }
private:
    int value;
};

44

主题

132

回帖

5432

积分

版主

积分
5432
 楼主| 发表于 昨天 21:35 | 显示全部楼层
假如在 utils.h 中只写了函数声明 inline int add(int a, int b);,而在 utils.cpp 中写了函数定义 inline int add(int a, int b) { return a + b; }。在 main.cpp 中调用 add(1, 2)。



这会导致add无法调用。因为inline要么完整地写在.h内部,要么写在class内部。现在add的逻辑在utils.cpp里,因此main.cpp无法获取。

44

主题

132

回帖

5432

积分

版主

积分
5432
 楼主| 发表于 昨天 21:48 | 显示全部楼层
class Grandpa { public: Grandpa() { cout << "G"; } ~Grandpa() { cout << "~G"; } };
class Father : public Grandpa { public: Father() { cout << "F"; } ~Father() { cout << "~F"; } };
class Mother { public: Mother() { cout << "M"; } ~Mother() { cout << "~M"; } };
class Child : public Father, public Mother { public: Child() { cout << "C"; } ~Child() { cout << "~C"; } };

构造顺序:Grandpa, Father, Mother, Child

析构顺序:相反

44

主题

132

回帖

5432

积分

版主

积分
5432
 楼主| 发表于 昨天 21:49 | 显示全部楼层
class Base {
public:
    void show() { cout << "Base no arg" << endl; }
    void show(int x) { cout << "Base int: " << x << endl; }
};


class Derived : public Base {
public:
    void show() { cout << "Derived no arg" << endl; }
};


int main() {
    Derived d;
    d.show();   // 语句 1
    d.show(10); // 语句 2
    return 0;
}


语句2有问题。要么 d.Base::show(10),要么在 Derived 里面增加另一个支持 show(int x) 的函数,也可以 using Base::show。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RealDevClub ( 沪ICP备2024093864号-1 )

GMT+8, 6-27-2026 02:35 , Processed in 0.066609 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表