c++学习

关键字

continue

continue 关键字用于控制循环语句的执行流程。当continue 语句被执行时,它会跳过当前循环迭代中剩余的代码,并立即开始下一次迭代。continue 通常用于 forwhiledo-while 循环中。

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

int main() {
    for (int i = 0; i < 10; i++) {
        if (i % 2 == 0) {
            continue;  // 跳过本次循环剩余的代码,继续下一次循环
        }
        cout << i << " ";
    }
    return 0;
}
在这个例子中,continue 语句会使程序跳过 i 为偶数的情况,因此只会打印奇数:1 3 5 7 9。

static

static 关键字在C++中有多种用途,分别可以应用于变量、函数和成员变量或成员函数。

1.静态局部变量 :静态局部变量是在函数内部定义的,但它们的生命周期跨越整个程序的运行时间。它们在第一次执行时初始化,并且其值在函数调用之间保持不变。

cpp 复制代码
#include <iostream>
void demo() {
    static int count = 0;  // 静态局部变量
    count++;
    std::cout << "Count: " << count << std::endl;
}

int main() {
    demo();  // 输出: Count: 1
    demo();  // 输出: Count: 2
    demo();  // 输出: Count: 3
    return 0;
}

2.静态全局变量:在文件作用域内,静态全局变量的作用域限制在定义它的文件内,其他文件不能访问它。这在多文件项目中非常有用,因为它避免了命名冲突。

cpp 复制代码
// File1.cpp
static int globalVar = 10;  // 静态全局变量

void printVar() {
    std::cout << globalVar << std::endl;
}

// File2.cpp
extern void printVar();

int main() {
    printVar();  // 输出: 10
    return 0;
}
  1. 静态成员变量:静态成员函数只能访问静态成员变量和静态成员函数。它们不依赖于类的实例,可以直接通过类名调用。
cpp 复制代码
#include <iostream>

class MyClass {
public:
    static void staticFunc() {
        std::cout << "This is a static function." << std::endl;
    }
};

int main() {
    MyClass::staticFunc();  // 通过类名调用静态成员函数
    return 0;
}

静态成员函数:静态成员函数只能访问静态成员变量和静态成员函数。它们不依赖于类的实例,可以直接通过类名调用。

cpp 复制代码
#include <iostream>

class MyClass {
public:
    static void staticFunc() {
        std::cout << "This is a static function." << std::endl;
    }
};

int main() {
    MyClass::staticFunc();  // 通过类名调用静态成员函数
    return 0;
}

静态变量在命名空间:在命名空间内声明静态变量也会使其仅在该编译单元中可见。

cpp 复制代码
namespace MyNamespace {
    static int namespaceVar = 42;
}

int main() {
    std::cout << MyNamespace::namespaceVar << std::endl;  // 输出: 42
    return 0;
}

虚函数

虚函数(Virtual Function)是面向对象编程中的一个概念,主要用于实现多态性 (polymorphism)。它是基类(父类)中的一个函数,可以被子类(派生类)重写(override)。当使用基类的指针或引用来调用虚函数时,实际调用的是子类中重写的版本,而不是基类中的版本。这个过程称为动态绑定 (dynamic binding)或后期绑定(late binding)。

虚函数特点:

  • 定义 :在基类中用 virtual 关键字修饰的函数就是虚函数。

  • 重写:子类可以选择性地重写基类中的虚函数,即子类可以提供自己版本的函数实现。

  • 动态绑定:通过基类的指针或引用调用虚函数时,实际调用的是指向对象的实际类型(运行时的类型)中的函数,而不是编译时类型的函数。

  • 虚函数表:编译器为每个定义了虚函数的类维护一个虚函数表(V-Table),这个表中存储了虚函数的地址。当通过基类指针或引用调用虚函数时,程序会根据虚函数表找到实际要调用的函数地址。

虚函数使用背景

虚函数的主要作用是通过基类接口实现多态。假设你有一个基类 Animal,以及从它派生的 DogCat 类。你可以在 Animal 中定义一个虚函数 speak(),然后在 DogCat 中重写这个函数

cpp 复制代码
class Animal {
public:
    virtual void speak() {
        std::cout << "Animal speaks" << std::endl;
    }
};

class Dog : public Animal {
public:
    void speak() override {
        std::cout << "Woof!" << std::endl;
    }
};

class Cat : public Animal {
public:
    void speak() override {
        std::cout << "Meow!" << std::endl;
    }
};
#现在,假设你有一个 Animal 类型的指针,指向 Dog 对象:
Animal* animal = new Dog();
animal->speak();
#在这里,尽管 animal 是 Animal 类型的指针,但由于 speak() 是虚函数,实际调用的是 Dog 类中重写的 speak() 方法。因此,输出结果将是 Woof! 而不是 Animal speaks。

全局变量

全局变量通常在文件的开头(在任何函数或类定义的外面)定义

cpp 复制代码
#include <iostream>

int globalVar = 10;  // 定义一个全局变量

int main() {
    std::cout << "Global variable: " << globalVar << std::endl;
    return 0;
}
#在这个例子中,globalVar 是一个全局变量,它可以在 main() 函数中访问。

全局变量的特点

  • 作用域

    • 全局变量的作用域是从定义点到程序结束。它可以在定义之后的任何函数或代码块中被访问。
  • 生命周期

    • 全局变量的生命周期从程序开始到程序结束。因此,它们在整个程序的执行过程中始终存在。
  • 初始值

    • 全局变量如果未显式初始化,默认会被初始化为0(对于整数类型)、0.0(对于浮点类型)或空指针(对于指针类型)。
  • 多文件中的全局变量

    • 如果在多文件中使用全局变量,可能会遇到重定义问题。为了避免这种问题,可以使用 extern 关键字声明全局变量,这样在其他文件中可以引用同一个全局变量。
相关推荐
阿阳微客2 小时前
Steam 搬砖项目深度拆解:从抵触到真香的转型之路
前端·笔记·学习·游戏
Chef_Chen7 小时前
从0开始学习R语言--Day18--分类变量关联性检验
学习
键盘敲没电8 小时前
【IOS】GCD学习
学习·ios·objective-c·xcode
海的诗篇_8 小时前
前端开发面试题总结-JavaScript篇(一)
开发语言·前端·javascript·学习·面试
AgilityBaby8 小时前
UE5 2D角色PaperZD插件动画状态机学习笔记
笔记·学习·ue5
AgilityBaby8 小时前
UE5 创建2D角色帧动画学习笔记
笔记·学习·ue5
武昌库里写JAVA10 小时前
iview Switch Tabs TabPane 使用提示Maximum call stack size exceeded堆栈溢出
java·开发语言·spring boot·学习·课程设计
一弓虽11 小时前
git 学习
git·学习
Moonnnn.13 小时前
【单片机期末】串行口循环缓冲区发送
笔记·单片机·嵌入式硬件·学习
viperrrrrrrrrr713 小时前
大数据学习(131)-Hive数据分析函数总结
大数据·hive·学习