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

面向对象程序设计复习贴

[复制链接]

45

主题

142

回帖

5177

积分

版主

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

45

主题

142

回帖

5177

积分

版主

积分
5177
 楼主| 发表于 6-26-2026 20:49:33 | 显示全部楼层
// 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 文件)单独定义一次,分配存储空间。



45

主题

142

回帖

5177

积分

版主

积分
5177
 楼主| 发表于 6-26-2026 20:53:20 | 显示全部楼层
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
    }
};

答案:全局 成员变量 形参


45

主题

142

回帖

5177

积分

版主

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

45

主题

142

回帖

5177

积分

版主

积分
5177
 楼主| 发表于 6-26-2026 21:34:16 | 显示全部楼层
典型的默认参数与构造函数冲突一则


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

45

主题

142

回帖

5177

积分

版主

积分
5177
 楼主| 发表于 6-26-2026 21:35:39 | 显示全部楼层
假如在 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无法获取。

45

主题

142

回帖

5177

积分

版主

积分
5177
 楼主| 发表于 6-26-2026 21:48:52 | 显示全部楼层
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

析构顺序:相反

45

主题

142

回帖

5177

积分

版主

积分
5177
 楼主| 发表于 6-26-2026 21:49:26 | 显示全部楼层
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。

45

主题

142

回帖

5177

积分

版主

积分
5177
 楼主| 发表于 6-27-2026 13:09:27 | 显示全部楼层
Const T & i 是安全而高效的传入方式

45

主题

142

回帖

5177

积分

版主

积分
5177
 楼主| 发表于 6-27-2026 13:32:01 | 显示全部楼层
重载运算符


前缀 ++a:T& operator++();(返回自身引用)。
后缀 a++:T operator++(int);(伪造的 int 参数仅用于区分,返回旧值副本)。


赋值运算符(operator=)
必须处理自我赋值,必须返回 *this(引用,支持链式 a=b=c)。
不能是全局函数,必须是成员函数。


流插入/提取(<< / >>)
必须重载为全局函数(因为左操作数是 ostream/istream,不是你的类)。
一般声明为友元,方便直接访问私有成员。

返回流引用:return os;(支持链式 cout << a << b;)。


类型转换(Conversion)
隐式转换陷阱:单参数构造函数(如 String(int n))会允许编译器将 int 隐式转为 String,容易引发意外。

解决方案:加 explicit 关键字,禁止隐式转换(只允许显式构造)。


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

本版积分规则

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

GMT+8, 8-11-2026 13:46 , Processed in 0.061337 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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