一、成员变量详解

1.1 成员变量的类型与声明

class MemberVariables {
private:
    // 1. 基本类型成员变量
    int intMember;
    double doubleMember;
    char charMember;
    bool boolMember;
    
    // 2. 指针成员变量
    int* ptrMember;
    char* dynamicArray;
    
    // 3. 引用成员变量(必须在构造函数初始化列表中初始化)
    int& refMember;
    
    // 4. 数组成员变量
    int arrayMember[100];
    std::array<int, 50> stdArrayMember;
    
    // 5. 类类型成员变量
    std::string strMember;
    std::vector<int> vecMember;
    
    // 6. const成员变量(必须在初始化列表中初始化)
    const int constMember;
    
    // 7. mutable成员变量(可在const函数中修改)
    mutable int cacheValue;
    mutable bool cacheValid;
    
    // 8. static成员变量(类级别共享)
    static int staticMember;
    static const int staticConstMember = 100;  // C++11允许类内初始化
    static inline int staticInlineMember = 200; // C++17
    
    // 9. C++11成员初始化
    int modernMember1 = 42;              // 默认成员初始化器
    double modernMember2{3.14};          // 统一初始化
    std::vector<int> modernVec{1,2,3,4}; // 列表初始化
    
public:
    // 构造函数展示初始化
    MemberVariables(int& ref, int constVal) 
        : refMember(ref)           // 引用必须初始化
        , constMember(constVal)    // const必须初始化
        , intMember(0)             // 普通成员初始化
        , ptrMember(nullptr)       // 指针初始化
        , cacheValid(false) {
        // 构造函数体
        dynamicArray = new char[100];
    }
    
    ~MemberVariables() {
        delete[] dynamicArray;
    }
};
 
// static成员变量定义(类外)
int MemberVariables::staticMember = 0;

1.2 成员变量的内存布局

class MemoryLayoutDemo {
    // 成员变量的对齐和填充
    class AlignmentDemo {
        char a;      // offset 0, size 1
        // padding 3 bytes
        int b;       // offset 4, size 4
        char c;      // offset 8, size 1
        // padding 3 bytes
        int d;       // offset 12, size 4
    }; // total size: 16 bytes
    
    // 使用pragma pack控制对齐
    #pragma pack(push, 1)
    class PackedClass {
        char a;      // offset 0, size 1
        int b;       // offset 1, size 4
        char c;      // offset 5, size 1
        int d;       // offset 6, size 4
    }; // total size: 10 bytes
    #pragma pack(pop)
    
    // 位域成员
    class BitFieldDemo {
        unsigned int flag1 : 1;   // 1 bit
        unsigned int flag2 : 1;   // 1 bit
        unsigned int value : 6;   // 6 bits
        unsigned int reserved : 24; // 24 bits
    }; // total: 32 bits (4 bytes)
    
    // 联合体成员
    class UnionMember {
        union {
            int intValue;
            float floatValue;
            char bytes[4];
        } data;
        
        enum class Type { INT, FLOAT, BYTES } type;
        
    public:
        void setInt(int val) {
            data.intValue = val;
            type = Type::INT;
        }
        
        void setFloat(float val) {
            data.floatValue = val;
            type = Type::FLOAT;
        }
    };
};

1.3 静态成员变量详解

class StaticMemberDemo {
private:
    static int instanceCount;           // 实例计数器
    static const int MAX_INSTANCES = 100; // 编译时常量
    
    // C++17 inline静态成员变量
    inline static std::string className = "StaticMemberDemo";
    
    // 静态成员可以是复杂类型
    static std::map<int, std::string> registry;
    
public:
    StaticMemberDemo() {
        if (++instanceCount > MAX_INSTANCES) {
            throw std::runtime_error("Too many instances");
        }
    }
    
    ~StaticMemberDemo() {
        --instanceCount;
    }
    
    // 静态成员函数访问静态成员
    static int getInstanceCount() {
        return instanceCount;
    }
    
    // 静态局部变量(Meyer's Singleton)
    static StaticMemberDemo& getInstance() {
        static StaticMemberDemo instance;  // 线程安全(C++11)
        return instance;
    }
    
    // 静态成员初始化辅助类
    class StaticInitializer {
    public:
        StaticInitializer() {
            // 复杂的静态成员初始化
            registry[1] = "First";
            registry[2] = "Second";
        }
    };
    
private:
    static StaticInitializer initializer;
};
 
// 类外定义
int StaticMemberDemo::instanceCount = 0;
std::map<int, std::string> StaticMemberDemo::registry;
StaticMemberDemo::StaticInitializer StaticMemberDemo::initializer;

二、成员函数详解

2.1 成员函数的类型

class MemberFunctions {
private:
    int data;
    mutable int cachedValue;
    
public:
    // 1. 普通成员函数
    void normalFunction() {
        data = 10;  // 可以修改成员变量
    }
    
    // 2. const成员函数
    int getValue() const {
        // data = 20;  // 错误:不能修改非mutable成员
        cachedValue = 100;  // 可以修改mutable成员
        return data;
    }
    
    // 3. const和非const重载
    int& getData() { return data; }
    const int& getData() const { return data; }
    
    // 4. volatile成员函数
    void volatileFunction() volatile {
        // 用于volatile对象
    }
    
    // 5. const volatile成员函数
    void constVolatileFunction() const volatile {
        // 最严格的成员函数
    }
    
    // 6. 引用限定成员函数(C++11)
    void processLValue() & {
        std::cout << "Called on lvalue\n";
    }
    
    void processRValue() && {
        std::cout << "Called on rvalue\n";
    }
    
    // 7. 静态成员函数
    static void staticFunction() {
        // 没有this指针,不能访问非静态成员
        // data = 30;  // 错误
    }
    
    // 8. 虚函数
    virtual void virtualFunction() {
        std::cout << "Base virtual function\n";
    }
    
    // 9. 纯虚函数
    virtual void pureVirtualFunction() = 0;
    
    // 10. 内联成员函数
    inline void inlineFunction() {
        data = 40;
    }
    
    // 11. 模板成员函数
    template<typename T>
    void templateFunction(T value) {
        std::cout << "Template value: " << value << "\n";
    }
    
    // 12. friend函数(不是成员函数,但可以访问私有成员)
    friend void friendFunction(MemberFunctions& obj);
};
 
// 使用示例
void usageExample() {
    MemberFunctions obj;
    obj.processLValue();            // 左值调用
    MemberFunctions().processRValue(); // 右值调用
}

2.2 成员函数的重载

class FunctionOverloading {
private:
    std::vector<int> data;
    
public:
    // 1. 参数数量不同
    void process() {
        std::cout << "No parameters\n";
    }
    
    void process(int x) {
        std::cout << "One parameter: " << x << "\n";
    }
    
    void process(int x, int y) {
        std::cout << "Two parameters: " << x << ", " << y << "\n";
    }
    
    // 2. 参数类型不同
    void process(double x) {
        std::cout << "Double parameter: " << x << "\n";
    }
    
    void process(const std::string& s) {
        std::cout << "String parameter: " << s << "\n";
    }
    
    // 3. const重载
    int& operator[](size_t index) {
        return data[index];
    }
    
    const int& operator[](size_t index) const {
        return data[index];
    }
    
    // 4. 引用限定符重载(C++11)
    void setValue(int val) & {
        data.push_back(val);
        std::cout << "Set on lvalue\n";
    }
    
    void setValue(int val) && {
        data.push_back(val);
        std::cout << "Set on rvalue (move)\n";
    }
    
    // 5. noexcept重载(C++17)
    void operation() noexcept {
        std::cout << "Noexcept version\n";
    }
    
    void operation() {
        std::cout << "Throwing version\n";
    }
};

2.3 特殊成员函数

class SpecialMemberFunctions {
private:
    int* data;
    size_t size;
    
public:
    // 1. 默认构造函数
    SpecialMemberFunctions() 
        : data(nullptr), size(0) {
        std::cout << "Default constructor\n";
    }
    
    // 2. 参数化构造函数
    explicit SpecialMemberFunctions(size_t n) 
        : data(new int[n]()), size(n) {
        std::cout << "Parameterized constructor\n";
    }
    
    // 3. 拷贝构造函数
    SpecialMemberFunctions(const SpecialMemberFunctions& other)
        : data(new int[other.size]), size(other.size) {
        std::copy(other.data, other.data + size, data);
        std::cout << "Copy constructor\n";
    }
    
    // 4. 移动构造函数
    SpecialMemberFunctions(SpecialMemberFunctions&& other) noexcept
        : data(std::exchange(other.data, nullptr))
        , size(std::exchange(other.size, 0)) {
        std::cout << "Move constructor\n";
    }
    
    // 5. 拷贝赋值运算符
    SpecialMemberFunctions& operator=(const SpecialMemberFunctions& other) {
        std::cout << "Copy assignment\n";
        if (this != &other) {
            // Copy-and-swap idiom
            SpecialMemberFunctions temp(other);
            swap(temp);
        }
        return *this;
    }
    
    // 6. 移动赋值运算符
    SpecialMemberFunctions& operator=(SpecialMemberFunctions&& other) noexcept {
        std::cout << "Move assignment\n";
        if (this != &other) {
            delete[] data;
            data = std::exchange(other.data, nullptr);
            size = std::exchange(other.size, 0);
        }
        return *this;
    }
    
    // 7. 析构函数
    ~SpecialMemberFunctions() {
        delete[] data;
        std::cout << "Destructor\n";
    }
    
    // 辅助函数
    void swap(SpecialMemberFunctions& other) noexcept {
        std::swap(data, other.data);
        std::swap(size, other.size);
    }
    
    // 转换函数
    explicit operator bool() const {
        return data != nullptr && size > 0;
    }
    
    operator std::vector<int>() const {
        return std::vector<int>(data, data + size);
    }
};

三、成员函数指针

3.1 成员函数指针的定义和使用

class MemberFunctionPointers {
private:
    int value;
    
public:
    void setValue(int v) { value = v; }
    int getValue() const { return value; }
    void print() { std::cout << "Value: " << value << "\n"; }
    static void staticPrint() { std::cout << "Static function\n"; }
    
    // 成员函数指针使用示例
    void demonstratePointers() {
        // 1. 定义成员函数指针类型
        using SetterPtr = void (MemberFunctionPointers::*)(int);
        using GetterPtr = int (MemberFunctionPointers::*)() const;
        using PrintPtr = void (MemberFunctionPointers::*)();
        
        // 2. 获取成员函数地址
        SetterPtr setter = &MemberFunctionPointers::setValue;
        GetterPtr getter = &MemberFunctionPointers::getValue;
        PrintPtr printer = &MemberFunctionPointers::print;
        
        // 3. 通过对象调用
        MemberFunctionPointers obj;
        (obj.*setter)(42);           // 对象调用
        int val = (obj.*getter)();   // 获取值
        (obj.*printer)();             // 打印
        
        // 4. 通过指针调用
        MemberFunctionPointers* ptr = &obj;
        (ptr->*setter)(100);          // 指针调用
        val = (ptr->*getter)();
        (ptr->*printer)();
        
        // 5. 静态成员函数指针(普通函数指针)
        void (*staticPtr)() = &MemberFunctionPointers::staticPrint;
        staticPtr();  // 直接调用
    }
};
 
// 成员函数指针的高级应用
class CommandPattern {
    using Command = void (CommandPattern::*)();
    std::map<std::string, Command> commands;
    
public:
    CommandPattern() {
        commands["open"] = &CommandPattern::open;
        commands["close"] = &CommandPattern::close;
        commands["save"] = &CommandPattern::save;
    }
    
    void execute(const std::string& cmd) {
        auto it = commands.find(cmd);
        if (it != commands.end()) {
            (this->*(it->second))();
        }
    }
    
private:
    void open() { std::cout << "Opening...\n"; }
    void close() { std::cout << "Closing...\n"; }
    void save() { std::cout << "Saving...\n"; }
};

四、this指针

4.1 this指针的本质和使用

class ThisPointer {
private:
    int x, y;
    
public:
    // this指针的基本使用
    ThisPointer(int x, int y) {
        this->x = x;  // 区分参数和成员变量
        this->y = y;
    }
    
    // 返回*this实现链式调用
    ThisPointer& setX(int x) {
        this->x = x;
        return *this;
    }
    
    ThisPointer& setY(int y) {
        this->y = y;
        return *this;
    }
    
    // 链式调用示例
    void chainExample() {
        ThisPointer obj(0, 0);
        obj.setX(10).setY(20).print();
    }
    
    void print() const {
        // const成员函数中this是const指针
        // this类型:const ThisPointer* const
        std::cout << "(" << this->x << ", " << this->y << ")\n";
    }
    
    // 比较对象
    bool isEqual(const ThisPointer& other) const {
        return this == &other;  // 比较地址
    }
    
    // 删除自己(危险操作)
    void deleteSelf() {
        delete this;  // 调用后this变为野指针
        // 不能再访问任何成员
    }
    
    // 在成员函数中创建自己的副本
    ThisPointer* clone() const {
        return new ThisPointer(*this);
    }
};

五、成员访问控制

5.1 访问权限的继承和友元

class AccessControl {
private:
    int privateData = 10;
    void privateMethod() { std::cout << "Private\n"; }
    
protected:
    int protectedData = 20;
    void protectedMethod() { std::cout << "Protected\n"; }
    
public:
    int publicData = 30;
    void publicMethod() { std::cout << "Public\n"; }
    
    // 友元函数可以访问所有成员
    friend void friendFunction(AccessControl& obj);
    
    // 友元类
    friend class FriendClass;
    
    // 内部类对外部类的访问
    class InnerClass {
    public:
        void accessOuter(AccessControl& outer) {
            outer.privateData = 100;    // 可以访问私有成员
            outer.privateMethod();
        }
    };
};
 
// 友元函数实现
void friendFunction(AccessControl& obj) {
    obj.privateData = 40;    // 访问私有成员
    obj.privateMethod();
    obj.protectedData = 50;  // 访问保护成员
    obj.protectedMethod();
}
 
// 继承中的访问控制
class PublicDerived : public AccessControl {
public:
    void useInherited() {
        // privateData = 1;   // 错误:不能访问私有成员
        protectedData = 2;    // 可以访问保护成员
        publicData = 3;       // 可以访问公有成员
    }
};
 
class ProtectedDerived : protected AccessControl {
    // 所有public成员变为protected
};
 
class PrivateDerived : private AccessControl {
    // 所有成员变为private
};

六、成员函数的高级特性

6.1 完美转发和可变参数模板

class AdvancedFeatures {
private:
    std::vector<std::string> messages;
    
public:
    // 可变参数模板成员函数
    template<typename... Args>
    void log(Args&&... args) {
        std::stringstream ss;
        ((ss << std::forward<Args>(args) << " "), ...);  // C++17 fold expression
        messages.push_back(ss.str());
    }
    
    // 完美转发构造函数
    template<typename... Args>
    void emplace(Args&&... args) {
        messages.emplace_back(std::forward<Args>(args)...);
    }
    
    // SFINAE应用
    template<typename T>
    typename std::enable_if<std::is_integral<T>::value, void>::type
    process(T value) {
        std::cout << "Processing integer: " << value << "\n";
    }
    
    template<typename T>
    typename std::enable_if<std::is_floating_point<T>::value, void>::type
    process(T value) {
        std::cout << "Processing float: " << value << "\n";
    }
    
    // C++20 概念约束
    #if __cplusplus >= 202002L
    template<typename T>
    requires std::integral<T>
    void modernProcess(T value) {
        std::cout << "Processing with concept: " << value << "\n";
    }
    #endif
};

6.2 lambda表达式和成员函数

class LambdaIntegration {
private:
    int value = 42;
    
public:
    // 在成员函数中使用lambda
    void useLambda() {
        // 捕获this指针
        auto lambda1 = [this]() {
            return value * 2;  // 访问成员变量
        };
        
        // C++17 捕获*this(按值捕获对象)
        auto lambda2 = [*this]() {
            return value * 3;  // 访问副本的成员
        };
        
        // 捕获成员变量
        auto lambda3 = [v = value]() {
            return v * 4;
        };
        
        std::cout << lambda1() << ", " 
                  << lambda2() << ", " 
                  << lambda3() << "\n";
    }
    
    // 返回lambda
    std::function<int()> createGetter() {
        return [this]() { return value; };
    }
    
    // 接受lambda作为参数
    template<typename Func>
    void forEach(Func func) {
        func(value);
    }
};

七、性能优化

7.1 内联和优化

class PerformanceOptimization {
private:
    int data[1000];
    
public:
    // 显式内联
    inline int getElement(int index) const {
        return data[index];
    }
    
    // 强制内联(编译器特定)
    [[gnu::always_inline]] 
    void alwaysInline() {
        // 函数体
    }
    
    // 禁止内联
    [[gnu::noinline]]
    void neverInline() {
        // 复杂函数体
    }
    
    // constexpr成员函数(编译时计算)
    constexpr int calculate(int x) const {
        return x * x + 2 * x + 1;
    }
    
    // C++20 consteval(必须编译时计算)
    #if __cplusplus >= 202002L
    consteval int mustBeCompileTime(int x) {
        return x * x;
    }
    #endif
    
    // noexcept优化
    void fastOperation() noexcept {
        // 保证不抛出异常,允许更好的优化
    }
    
    // 返回值优化(RVO/NRVO)
    std::vector<int> createVector() {
        std::vector<int> result;
        result.reserve(1000);
        // 填充数据
        return result;  // NRVO优化
    }
};

7.2 缓存友好的设计

class CacheFriendly {
    // 热数据和冷数据分离
    struct HotData {
        int frequentlyUsed1;
        int frequentlyUsed2;
        double frequentlyUsed3;
    };
    
    struct ColdData {
        std::string rarelyUsed1;
        std::vector<int> rarelyUsed2;
        std::map<int, std::string> rarelyUsed3;
    };
    
    HotData hot;
    std::unique_ptr<ColdData> cold;  // 延迟初始化
    
public:
    // 访问热数据(快速)
    int getFrequent() const {
        return hot.frequentlyUsed1;
    }
    
    // 访问冷数据(慢,但不影响热数据缓存)
    const std::string& getRare() {
        if (!cold) {
            cold = std::make_unique<ColdData>();
        }
        return cold->rarelyUsed1;
    }
};