封装是面向对象编程的基本概念之一,它将数据和操作数据的函数捆绑在一起,并对外隐藏其内部实现细节。C++通过访问修饰符(public, protected, private)来实现封装。
class MyClass {private: int privateVar;public: void setVar(int var) { privateVar = var; } int getVar() { return privateVar; }};
在上面的例子中,privateVar被封装在MyClass中,外部无法直接访问它,只能通过公共方法setVar和getVar进行访问。
继承允许一个类从另一个类获取属性和方法,从而实现代码重用和层次化组织。C++支持单继承和多继承。
class Base {public: void display() { std::cout << "Base class display function" << std::endl; }};class Derived : public Base {public: void display() { std::cout << "Derived class display function" << std::endl; }};
在这个例子中,Derived类继承了Base类,并重写了display函数。
多态性允许在父类和子类之间进行灵活的函数调用。C++支持静态多态(通过函数重载和模板实现)和动态多态(通过虚函数实现)。
class Base {public: virtual void display() { std::cout << "Base class display function" << std::endl; }};class Derived : public Base {public: void display() override { std::cout << "Derived class display function" << std::endl; }};
在这里,通过virtual关键字和override,实现了动态多态。
构造函数在创建对象时自动调用,用于初始化对象。析构函数在对象销毁时自动调用,用于清理资源。
class MyClass {public: MyClass() { std::cout << "Constructor called" << std::endl; } ~MyClass() { std::cout << "Destructor called" << std::endl; }};
创建和销毁MyClass对象时,会自动调用对应的构造函数和析构函数。
拷贝构造函数用于创建一个新对象,使其成为现有对象的副本。它在对象通过值传递、返回值或显式复制时调用。
class MyClass {public: int* data; MyClass(int value) { data = new int(value); } // Copy constructor MyClass(const MyClass &obj) { data = new int(*obj.data); } ~MyClass() { delete data; }};
通过深拷贝机制,MyClass对象的数据成员data被安全地复制。
赋值运算符用于将一个对象的值赋给另一个现有对象。默认情况下,C++提供了按位复制的赋值运算符,但对于动态分配资源的类,需要自定义赋值运算符。
class MyClass {public: int* data; MyClass(int value) { data = new int(value); } MyClass& operator=(const MyClass &obj) { if (this != &obj) { delete data; data = new int(*obj.data); } return *this; } ~MyClass() { delete data; }};
在这个例子中,通过自定义赋值运算符,确保了对象资源的安全分配和释放。
静态成员属于类而不是类的对象,它们在所有实例之间共享。静态成员函数只能访问静态数据成员。
class MyClass {public: static int staticVar; static void staticFunc() { std::cout << "Static function called" << std::endl; }};int MyClass::staticVar = 0;
静态成员变量和函数不依赖于类的实例,可以直接通过类名调用。
友元函数或友元类可以访问另一个类的私有和保护成员。友元关系不是互相的,也不是传递的。
class MyClass {private: int privateVar;public: MyClass() : privateVar(0) {} friend void display(const MyClass &obj);};void display(const MyClass &obj) { std::cout << "Private variable: " << obj.privateVar << std::endl;}
在这个例子中,友元函数display能够访问MyClass的私有成员privateVar。
模板类使得类能够适用于多种数据类型,而不必重复编写相同的代码。C++模板类支持泛型编程。
template <typename T>class MyClass {private: T data;public: MyClass(T value) : data(value) {} T getData() { return data; }};MyClass<int> intObj(5);MyClass<double> doubleObj(3.14);
通过模板类,MyClass可以处理不同类型的数据,如int和double。
运算符重载允许为用户自定义类型定义新的操作符行为,从而使类的对象能够使用自然的语法进行操作。
class MyClass {private: int value;public: MyClass(int val) : value(val) {} MyClass operator+(const MyClass &obj) { return MyClass(value + obj.value); } void display() { std::cout << "Value: " << value << std::endl; }};MyClass obj1(5), obj2(3);MyClass obj3 = obj1 + obj2;obj3.display(); // Output: Value: 8
在这个例子中,重载+运算符使得MyClass对象能够直接相加。
C++类的上述10条特性展示了其强大的面向对象编程能力。通过深入理解和掌握这些特性,开发者可以设计出高效、灵活和可维护的代码。