C++ 类和对象(一)

简介: C++ 类和对象(一)

C++是一种支持面向对象编程的高级编程语言,类和对象是C++中面向对象编程的基本概念。

类是一种用户自定义的数据类型,它可以包含属性和方法。在类中定义的属性称为成员变量,可以存储对象的状态;而方法称为成员函数,可以操作这些成员变量或实现其他功能。类通过封装数据和行为,提供了一种有效的编程方式,可以将复杂的问题简化为一组简单的对象和相应的方法。

对象是类的具体实例,它可以调用类中定义的成员函数和访问成员变量。每个对象都有其自身的状态和行为,通过创建不同的对象来完成不同的任务。

下面是一个简单的C++类的示例:

```cpp
class Person {
public:
    string name;
    int age;
    void sayHello() {
        cout << "Hello, my name is " << name << ", and I'm " << age << " years old." << endl;
    }
};
```

在这个示例中,我们定义了一个名为Person的类,它包含两个公共成员变量name和age,以及一个公共成员函数sayHello。其中,公共成员变量可以被外部类的对象访问和修改,公共成员函数可以被外部类的对象调用。

要使用这个类,需要先创建该类的对象。例如:

```cpp
Person person1;
person1.name = "Alice";
person1.age = 18;
person1.sayHello();
```

这里我们创建了一个名为person1的Person对象,并给它的成员变量name和age分别赋值。然后,我们调用sayHello函数,输出该对象的信息。

总之,类和对象是C++中面向对象编程的基本概念,通过封装数据和行为,提供了一种有效的编程方式,可以将复杂的问题简化为一组简单的对象和相应的方法。除了成员变量和成员函数外,C++中的类还可以有构造函数和析构函数。构造函数是一种特殊的成员函数,它在创建对象时被调用,负责初始化对象的成员变量;而析构函数则在对象被销毁时自动调用,用于清理对象所占用的资源。

下面是一个带有构造函数和析构函数的Person类示例:

```cpp
class Person {
public:
    string name;
    int age;
    Person(string n, int a) { // 构造函数
        name = n;
        age = a;
        cout << "A person named " << name << " is created." << endl;
    }
    ~Person() { // 析构函数
        cout << "A person named " << name << " is destroyed." << endl;
    }
    void sayHello() {
        cout << "Hello, my name is " << name << ", and I'm " << age << " years old." << endl;
    }
};
```

在这个示例中,我们在类定义中添加了一个构造函数和一个析构函数,分别完成对象的初始化和清理工作。构造函数的名称与类名称相同,没有返回类型,可以带有参数。析构函数的名称也与类名称相同,但在前面加上一个波浪号"~",也没有返回类型,不带参数。

要使用这个类,可以像这样创建对象:

```cpp
Person person1("Alice", 18);
person1.sayHello();
```

在创建对象时,会自动调用构造函数,完成对象的初始化;而在对象被销毁时,会自动调用析构函数,完成清理工作。

总之,C++中的类和对象是面向对象编程的基本概念,通过封装数据和行为,提供了一种有效的编程方式。除了成员变量和成员函数外,类还可以有构造函数和析构函数,分别用于对象的初始化和清理工作。在C++中,类还有一些其他的特性,例如:

- 可见性控制:类的成员可以被限定为公共(public)、私有(private)或受保护(protected),以实现封装和数据隐藏。公共成员可以被任何对象访问和修改,私有成员只能被同类对象访问和修改,受保护成员可以被同类对象和派生类对象访问和修改。

- 继承:子类可以从父类继承属性和方法,并且可以添加自己的属性和方法。继承可以提高代码重用性和可维护性,也是实现多态(polymorphism)和抽象(abstraction)的基础。

- 多态:同一个函数可以根据不同的调用方式产生不同的行为,这种现象称为多态。C++中,多态可以通过虚函数(virtual function)和纯虚函数(pure virtual function)来实现。

下面是一个带有继承和多态的Person类示例:

```cpp
class Student : public Person { // 继承自Person类
public:
    string school;
    Student(string n, int a, string s) : Person(n, a) { // 调用父类构造函数
        school = s;
        cout << "A student named " << name << " is created." << endl;
    }
    void sayHello() { // 重载父类函数
        cout << "Hello, my name is " << name << ", and I'm a student from " << school << "." << endl;
    }
};
void introduce(Person& p) { // 多态函数
    p.sayHello(); // 调用虚函数实现多态
}
int main() {
    Person person1("Alice", 18);
    Student student1("Bob", 20, "Harvard");
    introduce(person1);
    introduce(student1);
    return 0;
}
```

在这个示例中,我们定义了一个名为Student的子类,继承自Person父类。在子类中,我们添加了一个新的成员变量school,并重载了父类的sayHello函数,以实现不同的行为。

在main函数中,我们分别创建了一个Person对象和一个Student对象,并通过多态函数introduce来演示多态调用的效果。由于p.sayHello是虚函数,因此可以根据不同的参数类型产生不同的行为,实现多态效果。

总之,C++中的类还有许多其他特性,如可见性控制、继承和多态等,这些特性为面向对象编程提供了更加强大的功能和灵活性。熟练掌握这些特性,可以帮助程序员更加高效地开发出可靠、可维护的软件系统。另外,C++中的类还可以有静态成员和常量成员。静态成员是与类相关联的成员变量或成员函数,它们不属于任何对象,而是属于整个类。常量成员是在定义时被初始化的常量,它们不能被修改。

下面是一个带有静态成员和常量成员的Person类示例:

```cpp
class Person {
public:
    static int count; // 静态成员,记录创建的对象数
    const string type = "human"; // 常量成员,类型为人类
    string name;
    int age;
    Person(string n, int a) {
        name = n;
        age = a;
        count++; // 每次创建对象时增加计数器
        cout << "A person named " << name << " is created. Now there are " << count << " persons." << endl;
    }
    ~Person() {
        count--; // 每次销毁对象时减少计数器
        cout << "A person named " << name << " is destroyed. Now there are " << count << " persons." << endl;
    }
    void sayHello() {
        cout << "Hello, my name is " << name << ", and I'm " << age << " years old." << endl;
    }
};
int Person::count = 0; // 静态成员需要在类外进行初始化
int main() {
    Person person1("Alice", 18);
    Person person2("Bob", 20);
    cout << person1.type << endl;
    return 0;
}
```

在这个示例中,我们定义了一个静态成员count,用于记录创建的Person对象数。同时,我们添加了一个常量成员type,表示该类对象的类型。

在main函数中,我们创建了两个Person对象,并输出了第一个对象的类型。由于type是常量成员,所以它不能被修改。

总之,C++中的类还可以有静态成员和常量成员,它们分别与整个类和单个对象相关联,为程序员提供了更加灵活的编程方式。熟练掌握这些特性,可以帮助程序员写出更加高效、可靠的代码。C++中的类还有一些高级特性,例如模板和友元。

模板(template)是一种通用的编程技术,可以将数据类型参数化,以实现代码重用和泛型编程。C++中的模板可以用于函数模板和类模板两种形式。

下面是一个简单的函数模板示例:

```cpp
template<typename T>
void swap(T& a, T& b) {
    T temp = a;
    a = b;
    b = temp;
}
```

在这个示例中,我们定义了一个名为swap的函数模板,它可以交换任意类型的值。其中,typename T表示T是一个类型参数,可以在函数调用时根据实际情况确定。

除了函数模板外,C++还支持类模板,它可以用于定义通用的类,以适应不同的数据类型。

友元(friend)是一种额外的访问控制方式,可以让一个函数或类访问另一个类的私有成员。友元机制可以在保护类的私有成员封装性的同时,允许某些函数或类访问这些成员,从而使得程序更加灵活。

下面是一个简单的友元示例:

```cpp
class Box {
private:
    int width;
public:
    Box(int w) { width = w; }
    friend void printWidth(Box box); // 声明友元函数
};
void printWidth(Box box) { // 定义友元函数
    cout << "Box width is: " << box.width << endl;
}
int main() {
    Box box(10);
    printWidth(box); // 可以访问私有成员
    return 0;
}
```

在这个示例中,我们定义了一个名为Box的类,它有一个私有成员width。然后我们声明了一个友元函数printWidth,使其可以访问Box类的私有成员。在main函数中,我们创建了一个Box对象,并调用了友元函数printWidth,成功访问了Box类的私有成员。

总之,C++中的类还有一些高级特性,例如模板和友元。掌握这些特性可以帮助程序员编写出更加通用、灵活的代码,提高编程效率和可维护性。除了上述特性,C++中的类还有一些其他的高级特性,例如异常处理、运算符重载和移动语义等。

异常处理(exception handling)是一种错误处理机制,可以在程序出现异常情况时,将控制权转移到指定的处理代码中。C++中的异常处理机制使用try-catch块实现,可以捕获并处理各种类型的异常。

下面是一个简单的异常处理示例:

```cpp
double divide(double a, double b) {
    if (b == 0) {
        throw "Division by zero!"; // 抛出异常
    }
    return a / b;
}
int main() {
    double x = 10, y = 0;
    try {
        double z = divide(x, y); // 可能会抛出异常
        cout << z << endl;
    } catch (const char* msg) { // 捕获异常
        cerr << msg << endl;
    }
    return 0;
}
```

在这个示例中,我们定义了一个名为divide的函数,用于计算两个数的商。如果除数为0,则会抛出一个字符串类型的异常。然后,在main函数中,我们调用divide函数,并用try-catch块包裹起来,以处理可能抛出的异常。

运算符重载(operator overloading)是一种重定义运算符行为的机制,它可以使得用户自定义类型支持内置类型的操作符,例如“+”、“-”等。通过运算符重载,可以让代码更加清晰、简洁,提高可读性和可维护性。

下面是一个简单的运算符重载示例:

```cpp
class Vector {
public:
    double x, y;
    Vector(double a, double b) {
        x = a;
        y = b;
    }
    Vector operator+(const Vector& v) { // 重载“+”运算符
        return Vector(x + v.x, y + v.y);
    }
};
int main() {
    Vector v1(1, 2), v2(3, 4);
    Vector v3 = v1 + v2; // 使用重载的“+”运算符
    cout << v3.x << ", " << v3.y << endl;
    return 0;
}
```

在这个示例中,我们定义了一个名为Vector的类,它有两个成员变量x和y,表示二维向量的坐标。然后,我们重载了“+”运算符,使得Vector类型支持向量加法。在main函数中,我们创建了两个向量对象v1和v2,并使用重载的“+”运算符计算它们的和。

移动语义(move semantics)是一种优化机制,可以减少对象拷贝时的开销。在C++11标准中,引入了右值引用(rvalue reference)和移动构造函数(move constructor)等新特性,以实现更加高效的对象拷贝和转移。

下面是一个简单的移动语义示例:

```cpp
class MyString {
private:
    char* data;
public:
    MyString(const char* str) { // 构造函数,分配内存并初始化
        data = new char[strlen(str) + 1];
        strcpy(data, str);
    }
    ~MyString() { // 析构函数,释放内存
        delete[] data;
    }
    MyString(MyString&& other) { // 移动构造函数,转移资源
        data = other.data;
        other.data = nullptr;
    }
};
int main() {
    MyString str1("hello");
    MyString str2(std::move(str1)); // 调用移动构造函数
    return 0;
}
```

在这个示例中,我们定义了一个名为MyString的类,表示字符串类。然后,我们实现了一个移动构造函数,在对象拷贝时直接转移资源,避免了不必要的内存分配和拷贝。在main函数中,我们创建了两个MyString对象,并使用std::move函数将第一个对象的资源转移到第二个对象中。

总之,C++中的类还有许多其他高级特性,例如异常处理、运算符重载和移动语义等。这些特性可以帮助程序员编写出更加高效、灵活的代码,提高开发效率和可维护性。掌握这些特性可以让程序员写出更加优秀的代码,提升职业发展空间。除了上述特性,C++中的类还有一些其他的高级特性,例如多态、虚函数和抽象类等。

多态(polymorphism)是一种面向对象编程的基本概念,它可以使得不同类型的对象表现出相同的行为。在C++中,多态性主要通过虚函数(virtual function)来实现。

虚函数是一种特殊的成员函数,它可以被子类重写,并且在运行时动态绑定到正确的函数,以实现多态性。使用虚函数可以让程序更加灵活,可扩展性更好。

下面是一个简单的虚函数示例:

```cpp
class Shape {
public:
    virtual double getArea() { // 声明虚函数
        return 0;
    }
};
class Rectangle : public Shape {
private:
    double width, height;
public:
    Rectangle(double w, double h) {
        width = w;
        height = h;
    }
    double getArea() override { // 重写虚函数
        return width * height;
    }
};
class Circle : public Shape {
private:
    double radius;
public:
    Circle(double r) {
        radius = r;
    }
    double getArea() override { // 重写虚函数
        return 3.1415926 * radius * radius;
    }
};
int main() {
    Shape* shapes[2];
    shapes[0] = new Rectangle(3, 4);
    shapes[1] = new Circle(5);
    for (int i = 0; i < 2; i++) {
        cout << "Area of Shape " << i + 1 << " is: " << shapes[i]->getArea() << endl; // 动态绑定
    }
    return 0;
}
```

在这个示例中,我们定义了一个名为Shape的基类,它有一个虚函数getArea,用于计算面积。然后,我们定义了两个子类Rectangle和Circle,分别重写了getArea函数。在main函数中,我们创建了两个Shape指针对象,并将其指向不同的子类对象,以实现多态性。

目录
相关文章
|
12小时前
|
存储 编译器 C++
【C++ 初阶路】--- 类和对象(下)
【C++ 初阶路】--- 类和对象(下)
5 1
|
12小时前
|
存储 编译器 C语言
【C++初阶路】--- 类和对象(中)
【C++初阶路】--- 类和对象(中)
5 1
|
1天前
|
编译器 C++
C++练级之路——类和对象(中)
C++练级之路——类和对象(中)
7 1
|
1天前
|
编译器 C语言 C++
【C++/STL】:string类底层的模拟实现
【C++/STL】:string类底层的模拟实现
4 0
|
1天前
|
算法 C++ 容器
【C++/STL】:string类的基本使用
【C++/STL】:string类的基本使用
7 0
|
1天前
|
编译器 C语言 C++
【C++】:类和对象(下)
【C++】:类和对象(下)
8 0
|
1天前
|
C++
【C++】:日期类的实现 -- 日期计算器
【C++】:日期类的实现 -- 日期计算器
13 0
|
1天前
|
存储 编译器 C语言
【C++】:类和对象(上)
【C++】:类和对象(上)
7 0
|
1天前
|
API C++
c++进阶篇——初窥多线程(三)cpp中的线程类
C++11引入了`std::thread`,提供对并发编程的支持,简化多线程创建并增强可移植性。`std::thread`的构造函数包括默认构造、移动构造及模板构造(支持函数、lambda和对象)。`thread::get_id()`获取线程ID,`join()`确保线程执行完成,`detach()`使线程独立,`joinable()`检查线程状态,`operator=`仅支持移动赋值。`thread::hardware_concurrency()`返回CPU核心数,可用于高效线程分配。
|
6天前
|
C++
C++一分钟之-类与对象初步
【6月更文挑战第20天】C++的类是对象的蓝图,封装数据和操作。对象是类的实例。关注访问权限、构造析构函数的使用,以及内存管理(深拷贝VS浅拷贝)。示例展示了如何创建和使用`Point`类对象。通过实践和理解原理,掌握面向对象编程基础。
32 2
C++一分钟之-类与对象初步