5.static关键字的作用
static关键字的作用
static 是C++中的一个关键字,用于指定变量、函数或类成员的存储类型或作用域。
下面是 static 关键字的几种用法:
静态局部变量
在函数内部声明的局部变量可以使用 static 关键字进行声明,这将使变量在程序生命周期内只被初始化一次,即使函数被多次调用
静态全局变量
使用 static 关键字在函数外部声明全局变量,将使变量只能在当前文件中访问
静态成员变量
在类中声明的静态成员变量将被所有类对象共享,并且可以在不创建类对象的情况下使用
静态成员函数
在类中声明的静态成员函数可以在不创建类对象的情况下使用,并且不能访问非静态成员变量
静态局部变量
在函数内部声明的局部变量可以使用 static 关键字进行声明,这将使变量在程序生命周期内只被初始化一次,即使函数被多次调用。例如:
复制
void myFunction() {
static int count = 0;
count++;
std::cout << "Count: " << count << std::endl;
}
int main() {
myFunction(); // 输出 Count: 1
myFunction(); // 输出 Count: 2
myFunction(); // 输出 Count: 3
return 0;
}
静态全局变量
使用 static 关键字在函数外部声明全局变量,将使变量只能在当前文件中访问。例如:
复制
// 文件1.cpp
static int count = 0;
void myFunction() {
count++;
std::cout << "Count: " << count << std::endl;
}
// 文件2.cpp
void anotherFunction() {
// 编译错误,无法访问 count 变量
std::cout << "Count: " << count << std::endl;
}
int main() {
myFunction(); // 输出 Count: 1
myFunction(); // 输出 Count: 2
myFunction(); // 输出 Count: 3
return 0;
}
静态成员变量
在类中声明的静态成员变量将被所有类对象共享,并且可以在不创建类对象的情况下使用。例如:
复制
class MyClass {
public:
static int count;
};
int MyClass::count = 0;
int main() {
std::cout << "Count: " << MyClass::count << std::endl; // 输出 Count: 0
MyClass::count++;
std::cout << "Count: " << MyClass::count << std::endl; // 输出 Count: 1
return 0;
}
静态成员函数
在类中声明的静态成员函数可以在不创建类对象的情况下使用,并且不能访问非静态成员变量。例如:
复制
class MyClass {
public:
static void myFunction() {
std::cout << “Hello, World!” << std::endl;
}
};
int main() {
MyClass::myFunction(); // 输出 Hello, World!
return 0;
}
这些是 static 关键字的几种用法,它们都有不同的作用和用途。
编程题
Node* mergeLinkedList(Node* head1, Node* head2) {
if (head1 == nullptr) { return head2; }
if (head2 == nullptr) {return head1; }
Node* mergedHead = nullptr;
Node* tail = nullptr;
if (head1->data < head2->data) {
mergedHead = tail = head1;
head1 = head1->next;
} else {
mergedHead = tail = head2;
head2 = head2->next;
}
while (head1 != nullptr && head2 != nullptr) {
if (head1->data < head2->data) {
tail->next = head1;
tail = head1;
head1 = head1->next;
} else {
tail->next = head2;
tail = head2;
head2 = head2->next;
}
}
if (head1 != nullptr) {
tail->next = head1;
} else {
tail->next = head2;
}
return mergedHead;
}