第十一章 C++成员函数与静态成员详解

简介: 第十一章 C++成员函数与静态成员详解

第十一章 C++成员函数与静态成员详解

1. 概述

在C++中,成员函数是定义在类内部的函数,用于操作类的对象。静态成员是属于整个类而不是类的对象的成员。本文将详细讲解C++中的成员函数和静态成员,并结合代码和实际案例进行演示。

2. 成员函数的定义和使用

2.1 成员函数的定义

成员函数由两部分组成:声明和定义。声明位于类的内部,在类的外部进行定义。

class MyClass {
public:
    // 成员函数的声明
    void memberFunction(int arg);
    // 其他成员和数据...
};
// 成员函数的定义
void MyClass::memberFunction(int arg) {
    // 函数体
}

2.2 成员函数的使用

成员函数通过一个特殊的指针this访问调用它的对象。可以使用.运算符来调用成员函数。

MyClass obj;
obj.memberFunction(10);

2.3 访问成员变量

成员函数可以直接访问类中的成员变量。对于非static的成员函数,可以直接使用成员变量的名称来访问。

class MyClass {
public:
    int value;
    void displayValue() {
        cout << "Value: " << value << endl;
    }
};

2.4 静态成员函数

静态成员函数是一种属于类而不是类的对象的函数。它们在编译时就存在,无需创建对象即可访问。

class MyClass {
public:
    static void staticFunction() {
        // 静态成员函数的函数体
    }
};
// 调用静态成员函数
MyClass::staticFunction();

2.5 常量成员函数

常量成员函数是一种不修改成员变量的成员函数。它可以保证在被调用时不会改变对象的状态。通过在声明和定义中加上const关键字来实现。

class MyClass {
public:
    void displayValue() const {
        // 输出值但不修改成员变量
        cout << "Value: " << value << endl;
    }
};

3. 示例案例:购物车程序

下面是一个简单的购物车程序示例,用于演示成员函数和静态成员的使用。

#include <iostream>
#include <vector>
using namespace std;
class Cart {
private:
    vector<string> items;
    static int itemCount;
public:
    Cart() {
        itemCount++;
    }
    ~Cart() {
        itemCount--;
    }
    void addItem(const string& item) {
        items.push_back(item);
    }
    void removeItem(const string& item) {
        for (auto it = items.begin(); it != items.end(); ++it) {
            if (*it == item) {
                items.erase(it);
                break;
            }
        }
    }
    void displayItems() const {
        if (items.empty()) {
            cout << "Cart is empty." << endl;
        } else {
            cout << "Items in cart:" << endl;
            for (const auto& item : items) {
                cout << "- " << item << endl;
            }
        }
    }
    static int getItemCount() {
        return itemCount;
    }
};
int Cart::itemCount = 0;
int main() {
    Cart cart1;
    Cart cart2;
    cart1.addItem("Apple");
    cart1.addItem("Banana");
    cart1.displayItems();
    cart2.addItem("Orange");
    cart2.displayItems();
    cart1.removeItem("Apple");
    cart1.displayItems();
    cout << "Total carts: " << Cart::getItemCount() << endl;
    return 0;
}

运行结果:

Items in cart:
- Apple
- Banana
Items in cart:
- Orange
Items in cart:
- Banana
Total carts: 1

以上示例代码中,我们定义了一个Cart类来表示购物车。它包含一个items向量用于存储添加的物品,并使用itemCount静态成员变量来记录购物车对象的数量。

通过调用成员函数addItem和removeItem,我们可以在购物车中添加和移除物品。调用成员函数displayItems可以显示购物车中的所有物品。

静态成员函数getItemCount可以返回购物车对象的总数。我们可以通过直接调用Cart::getItemCount()来获取购物车对象的数量信息。

相关文章
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
544 12
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
280 0
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
963 6
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
439 5
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
876 6
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
434 0
C++ 多线程之线程管理函数
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
3100 1
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
309 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。