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指针对象,并将其指向不同的子类对象,以实现多态性。

目录
相关文章
|
7月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
3月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
89 0
|
3月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
167 0
|
5月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
175 12
|
6月前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
127 16
|
6月前
|
编译器 C++
类和对象(中 )C++
本文详细讲解了C++中的默认成员函数,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载和取地址运算符重载等内容。重点分析了各函数的特点、使用场景及相互关系,如构造函数的主要任务是初始化对象,而非创建空间;析构函数用于清理资源;拷贝构造与赋值运算符的区别在于前者用于创建新对象,后者用于已存在的对象赋值。同时,文章还探讨了运算符重载的规则及其应用场景,并通过实例加深理解。最后强调,若类中存在资源管理,需显式定义拷贝构造和赋值运算符以避免浅拷贝问题。
|
6月前
|
存储 编译器 C++
类和对象(上)(C++)
本篇内容主要讲解了C++中类的相关知识,包括类的定义、实例化及this指针的作用。详细说明了类的定义格式、成员函数默认为inline、访问限定符(public、protected、private)的使用规则,以及class与struct的区别。同时分析了类实例化的概念,对象大小的计算规则和内存对齐原则。最后介绍了this指针的工作机制,解释了成员函数如何通过隐含的this指针区分不同对象的数据。这些知识点帮助我们更好地理解C++中类的封装性和对象的实现原理。
|
6月前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
342 6
|
6月前
|
编译器 C++
类和对象(下)C++
本内容主要讲解C++中的初始化列表、类型转换、静态成员、友元、内部类、匿名对象及对象拷贝时的编译器优化。初始化列表用于成员变量定义初始化,尤其对引用、const及无默认构造函数的类类型变量至关重要。类型转换中,`explicit`可禁用隐式转换。静态成员属类而非对象,受访问限定符约束。内部类是独立类,可增强封装性。匿名对象生命周期短,常用于临时场景。编译器会优化对象拷贝以提高效率。最后,鼓励大家通过重复练习提升技能!
|
7月前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)