C++整理2

hwaityd / 2024-10-29 / 原文

语法规则

1. 命名规则

  • 概念:命名规则定义了在代码中如何命名变量、函数、类等标识符。
  • 语法:标识符必须以字母或下划线开头,后面可以跟字母、数字或下划线。
  • 特点:遵循命名规则可以避免语法错误,提高代码的可读性。

示例代码

// 正确的命名
int myVariable = 10;
float price_123 = 20.5;
MyClass myClassInstance;

// 错误的命名
int 1stVariable = 10; // 错误:以数字开头
int my-variable = 10; // 错误:包含非法字符

2. 作用域

  • 概念:作用域决定了在程序的哪些部分可以访问特定的变量或函数。
  • 函数原型作用域:在函数参数列表中定义的变量仅在该函数原型中可见。
  • 局部作用域:在函数内部定义的变量仅在该函数内部可见。
  • 类作用域:在类定义中声明的成员变量和成员函数仅在该类内部可见。
  • 命名空间作用域:在命名空间中定义的名称仅在该命名空间中可见。

示例代码

void myFunction(int param) { // param只在myFunction的作用域内可见
    int localVar = 5; // localVar只在myFunction的作用域内可见
}

class MyClass {
    int classVar; // classVar只在MyClass的作用域内可见

public:
    void classMethod() {
        int localVar = 5; // localVar只在classMethod的作用域内可见
    }
};

namespace MyNamespace {
    int namespaceVar = 5; // namespaceVar只在MyNamespace的作用域内可见
}

3. 作用域与可见性问题

  • 概念:当标识符在不同的作用域中重名时,会发生遮蔽现象,导致外层作用域的标识符在内层作用域中不可见。
  • 特点:合理管理作用域和可见性可以避免命名冲突,提高代码的可维护性。

示例代码

int globalVar = 10; // 全局变量

void function() {
    int globalVar = 20; // 局部变量遮蔽了全局变量
    std::cout << globalVar << std::endl; // 输出20
}

int main() {
    function();
    std::cout << globalVar << std::endl; // 输出10,访问全局变量
    return 0;
}

4. 关键字使用:改变作用域

  • extern:用于声明全局变量或函数,告诉编译器该变量或函数的定义在别的文件或代码区域。
    • 使用规则extern通常用于在一个文件中声明另一个文件中定义的全局变量或函数。
  • static:用于声明局部静态变量或静态成员变量,其生命周期贯穿整个程序,且在该作用域内可见。
    • 在C中的使用static变量或函数只能在定义它的文件内访问。
    • 在C++中的使用static成员变量和成员函数可以在类的所有对象之间共享。

extern的使用规则

// file1.cpp
int a = 42; // 定义一个全局变量a

// file2.cpp
extern int a; // 声明a,告诉编译器a的定义在别处
void function() {
    std::cout << a << std::endl; // 安全访问a
}

static在C和C++中的使用

// C中的静态全局变量
static int staticGlobalVar = 10; // 只能在当前文件中访问

// C++中的静态成员变量
class MyClass {
public:
    static int staticMemberVar; // 必须在类外初始化
};

int MyClass::staticMemberVar = 20; // 初始化静态成员变量

void function() {
    static int localStaticVar = 30; // 只在function内可见,多次调用只初始化一次
}

这些规则和关键字确保了程序的组织结构和变量的生命周期,使得代码更加模块化和易于管理。