C++的类功能整合

1. 类的基本概念

类是面向对象编程的核心,它封装了数据和操作数据的函数。

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

class MyClass {
public:
    int publicData;
    void publicFunction() {
        cout << "Public function" << endl;
    }

private:
    int privateData;
    void privateFunction() {
        cout << "Private function" << endl;
    }
};

int main() {
    MyClass obj;
    obj.publicData = 10;
    obj.publicFunction();
    // obj.privateData = 20; // 错误:private成员无法直接访问
    // obj.privateFunction(); // 错误:private成员无法直接访问
    return 0;
}

2. 成员变量和成员函数

成员变量是类中的数据,成员函数是类中的函数。

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

class MyClass {
public:
    int data; // 成员变量

    void display() { // 成员函数
        cout << "Data: " << data << endl;
    }
};

int main() {
    MyClass obj;
    obj.data = 42;
    obj.display(); // 输出: Data: 42
    return 0;
}

3. 访问修饰符

  • public:任何地方都可以访问。

  • private:只能类内部访问。

  • protected:类内部和派生类可以访问。

    cpp 复制代码
    #include <iostream>
    using namespace std;
    
    class MyClass {
    public:
        int publicData;
    
    private:
        int privateData;
    
    protected:
        int protectedData;
    
    public:
        void display() {
            cout << "Public: " << publicData << endl;
            cout << "Private: " << privateData << endl;
            cout << "Protected: " << protectedData << endl;
        }
    };
    
    int main() {
        MyClass obj;
        obj.publicData = 10;
        // obj.privateData = 20; // 错误:private成员无法直接访问
        // obj.protectedData = 30; // 错误:protected成员无法直接访问
        obj.display();
        return 0;
    }

4. 构造函数和析构函数

构造函数在对象创建时调用,析构函数在对象销毁时调用。

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

class MyClass {
public:
    MyClass() {
        cout << "Constructor" << endl;
    }

    ~MyClass() {
        cout << "Destructor" << endl;
    }
};

int main() {
    MyClass obj; // 创建对象时调用构造函数
    // 程序结束时调用析构函数
    return 0;
}

5. 运算符重载

允许自定义运算符的行为。

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

class Complex {
public:
    double real, imag;

    Complex(double r, double i) : real(r), imag(i) {}

    Complex operator + (const Complex& other) {
        return Complex(real + other.real, imag + other.imag);
    }
};

int main() {
    Complex c1(1.0, 2.0);
    Complex c2(3.0, 4.0);
    Complex c3 = c1 + c2;
    cout << "c3: " << c3.real << " + " << c3.imag << "i" << endl; // 输出: c3: 4 + 6i
    return 0;
}

6. 拷贝构造函数和赋值运算符

用于对象的拷贝和赋值。

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

class MyClass {
public:
    int data;

    MyClass(int d) : data(d) {}

    MyClass(const MyClass& other) : data(other.data) {
        cout << "Copy constructor" << endl;
    }

    MyClass& operator = (const MyClass& other) {
        if (this != &other) {
            data = other.data;
        }
        return *this;
    }
};

int main() {
    MyClass obj1(42);
    MyClass obj2 = obj1; // 调用拷贝构造函数
    MyClass obj3(0);
    obj3 = obj1; // 调用赋值运算符
    cout << "obj2.data: " << obj2.data << endl; // 输出: obj2.data: 42
    cout << "obj3.data: " << obj3.data << endl; // 输出: obj3.data: 42
    return 0;
}

7. 模板类

允许类在编译时根据类型参数生成不同的类。

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

template <typename T>
class MyTemplateClass {
public:
    T data;

    MyTemplateClass(T d) : data(d) {}

    void display() {
        cout << "Data: " << data << endl;
    }
};

int main() {
    MyTemplateClass<int> intObj(42);
    intObj.display(); // 输出: Data: 42

    MyTemplateClass<double> doubleObj(3.14);
    doubleObj.display(); // 输出: Data: 3.14
    return 0;
}

8. 异常处理

用于处理运行时错误。

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

class MyException : public exception {
public:
    const char* what() const throw() {
        return "My custom exception";
    }
};

void throwException() {
    throw MyException();
}

int main() {
    try {
        throwException();
    } catch (const MyException& e) {
        cout << "Caught exception: " << e.what() << endl; // 输出: Caught exception: My custom exception
    }
    return 0;
}

9. 智能指针

自动管理内存,避免内存泄漏。

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

class MyClass {
public:
    void display() {
        cout << "Display" << endl;
    }
};

int main() {
    unique_ptr<MyClass> ptr(new MyClass());
    ptr->display(); // 输出: Display
    return 0;
}

10. 继承和多态

继承允许子类继承父类的特性,多态允许同一接口有多种实现。

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

class Base {
public:
    virtual void display() const {
        cout << "Base class display" << endl;
    }

    virtual ~Base() {}
};

class Derived : public Base {
public:
    void display() const override {
        cout << "Derived class display" << endl;
    }
};

int main() {
    Base* b = new Derived();
    b->display(); // 输出: Derived class display
    delete b;
    return 0;
}

11. 纯虚函数和抽象类

纯虚函数使得类成为抽象类,不能直接实例化。

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

class AbstractBase {
public:
    virtual void pureVirtualFunction() const = 0;

    virtual ~AbstractBase() {}
};

class ConcreteDerived : public AbstractBase {
public:
    void pureVirtualFunction() const override {
        cout << "Concrete implementation" << endl;
    }
};

int main() {
    AbstractBase* a = new ConcreteDerived();
    a->pureVirtualFunction(); // 输出: Concrete implementation
    delete a;
    return 0;
}

12. 友元函数和友元类

友元可以访问类的私有成员。

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

class MyClass {
private:
    int privateData;

public:
    MyClass(int data) : privateData(data) {}

    friend void friendFunction(const MyClass& obj);
    friend class FriendClass;
};

void friendFunction(const MyClass& obj) {
    cout << "Private data: " << obj.privateData << endl;
}

class FriendClass {
public:
    void display(const MyClass& obj) {
        cout << "Private data: " << obj.privateData << endl;
    }
};

int main() {
    MyClass obj(42);
    friendFunction(obj); // 输出: Private data: 42

    FriendClass fc;
    fc.display(obj); // 输出: Private data: 42
    return 0;
}

13. 嵌套类

嵌套类是定义在另一个类内部的类。

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

class OuterClass {
public:
    class InnerClass {
    public:
        void display() const {
            cout << "Inner class display" << endl;
        }
    };

    void outerFunction() {
        InnerClass inner;
        inner.display();
    }
};

int main() {
    OuterClass::InnerClass inner;
    inner.display(); // 输出: Inner class display

    OuterClass outer;
    outer.outerFunction(); // 输出: Inner class display
    return 0;
}

14. 静态成员

静态成员属于类,而不是某个具体的对象。

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

class MyClass {
public:
    static int staticData;

    static void staticFunction() {
        cout << "Static data: " << staticData << endl;
    }
};

int MyClass::staticData = 10;

int main() {
    MyClass::staticFunction(); // 输出: Static data: 10
    MyClass::staticData = 20;
    MyClass::staticFunction(); // 输出: Static data: 20
    return 0;
}

15. 类型转换运算符

类型转换运算符允许将类的对象转换为其他类型。

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

class MyInteger {
private:
    int value;

public:
    MyInteger(int val) : value(val) {}

    operator int() const {
        return value;
    }
};

int main() {
    MyInteger mi(42);
    int num = mi; // 使用类型转换运算符
    cout << "num: " << num << endl; // 输出: num: 42
    return 0;
}

16. 命名空间

命名空间用于避免名称冲突。

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

namespace MyNamespace {
    void display() {
        cout << "Namespace display" << endl;
    }
}

int main() {
    MyNamespace::display(); // 输出: Namespace display
    return 0;
}

总结

通过这次整合,我们全面探讨了C++类的各个方面,从基本概念到高级特性,如继承、多态、纯虚函数、友元、嵌套类、静态成员、类型转换和命名空间等。这些特性使得C++在面向对象编程中非常强大和灵活。

相关推荐
两个人的幸福online8 分钟前
记录一次 用php 调用ai用stream返回
开发语言·php
漂流瓶66666635 分钟前
Scala的模式匹配变量类型
开发语言·后端·scala
夏天吃哈密瓜40 分钟前
Scala中的正则表达式01
大数据·开发语言·后端·正则表达式·scala
2401_8337880542 分钟前
Scala的模式匹配(2)
java·开发语言
Lbs_gemini060342 分钟前
C++研发笔记14——C语言程序设计初阶学习笔记12
c语言·开发语言·c++·笔记·学习
ac-er88881 小时前
GD库如何根据颜色生成纯色背景图
开发语言·php
悠悠龙龙2 小时前
框架模块说明 #05 权限管理_03
java·开发语言·spring
霖大侠2 小时前
Adversarial Learning forSemi-Supervised Semantic Segmentation
人工智能·算法·机器学习
阿华的代码王国3 小时前
【算法】——前缀和(矩阵区域和详解,文末附)
java·开发语言·算法·前缀和
Sunyanhui13 小时前
力扣 LCR训练计划2(剑指 Offer 22. 链表中倒数第k个节点)-140
算法·leetcode·链表