文章目录
1.unsigned int 和 int 做比较,使用显示转换static_cast
if(TimerEslaped(dwTime) > nTimeOut)
{
LOGERROR("Time Out");
return false;
}
if(TimerEslaped(dwTime) > static_cast<unsigned int>(nTimeOut))
{
LOGERROR("Time Out");
return false;
}
2.static_cast的用法
在C++中,static_cast
是一种强制类型转换操作符,用于在不同类型之间进行显式转换,其主要用途包括:
-
基本数据类型之间的转换:它可以用来在整数、浮点数之间进行转换,或是将枚举类型转换为整数类型等。
double pi = 3.14; int integerPart = static_cast<int>(pi); // 转换为整数,结果为 3
-
指针类型之间的转换:用于类的层次结构中,将基类指针或引用安全地转换到派生类指针或引用,反之亦然。只有当适用的对象确实是目标类型时,转换才是安全的。
class Base {}; class Derived : public Base {}; Base* basePtr = new Derived; Derived* derivedPtr = static_cast<Derived*>(basePtr); // 基类指针转换为派生类指针
-
将void指针转换为具体类型指针:当你从一个
void*
类型的指针转换到另一个具体类型的指针时使用。void* voidPtr = new int(42); int* intPtr = static_cast<int*>(voidPtr); // void 指针转换为 int 指针
-
进行一些隐式转换:比如非常量转换为常量,或者子类对象转为基类对象。
不过,static_cast
不能用于不相关类型之间的转换(如将一个整数转换为一个指针),也不能用于去除一个对象的 const
或 volatile
属性,对于这些操作应使用 const_cast
或 reinterpret_cast
。
与C风格的强制类型转换相比,static_cast
更加安全,因为它在编译时进行检查,从而避免了C风格转换的多义性和潜在风险。static_cast
也是最常用的C++强制类型转换操作符之一,因为它既能提供类型转换的灵活性,又能保证基本的安全性检查。
3.inline内联函数
C++教程网站:https://cplusplus.com/doc/tutorial/
4.静态存储和自动存储
这段话在描述 C++ 中变量存储类型(Storage classes)中的两种主要的存储期:静态存储期(Static storage duration)和自动存储期(Automatic storage duration)以及它们的不同行为。让我们来详细解释一下这段话的内容:
-
全局或命名空间作用域的变量使用静态存储(Static Storage):
- 这类变量在程序的整个执行期间都会分配存储空间。换句话说,这些变量在程序开始时被创建,在程序结束时被销毁。
- 全局变量或者处于命名空间(namespace)但不在任何函数内部声明的变量通常具有静态存储期。
- 如果这类变量没有显示地初始化,C++保证它们会被自动初始化为零。这意味着内置类型如 int、float 等将被初始化为 0,指针类型将被初始化为
nullptr
。
-
块作用域内的变量使用自动存储(Automatic Storage):
- 局部变量通常通过在函数内部声明来定义,这些变量只在包含它们的代码块({ … })中存在。一旦代码块执行完毕,这些局部变量的生命周期就结束了。
- 比如,一个函数中的局部变量,在函数被调用时,每次都会为这些变量分配存储空间,而当函数调用结束,这些存储空间就会被释放。
- 如果局部变量没有显示地初始化,它们将保持未初始化状态,其值是不确定的。引用这些未初始化变量的值是危险的,因为它们可能包含任何数据,甚至可能导致程序错误。
这段理解的关键在于:
- 静态存储期变量的生命周期贯穿整个程序执行周期,它们的初始值是确定的。
- 自动存储期变量的生命周期仅限于声明它们的代码块,在其未显示初始化的情况下它们的初始值是不确定的。
在实际编程中,明白变量何时被创建、销毁和它们的初始状态对于编写可靠和预测的代码是至关重要的。这也解释了为什么在某些情况下,全局变量(静态存储)可能比局部变量(自动存储)更容易管理,因为它们的行为通常更能预测。然而,全局变量的滥用也可能导致代码难以理解和维护,因此最好保持谨慎。
5.命名空间和using的使用
// using
#include <iostream>
using namespace std; //在使用std范围内的函数时,可以直接调用cin,而不用std::cin
//缺点是,代码多可能会名称混淆
namespace first
{
int x = 5;
int y = 10;
}
namespace second
{
double x = 3.1416;
double y = 2.7183;
}
int main () {
using first::x;
using second::y;
cout << x << '\n';
cout << y << '\n';
cout << first::y << '\n';
cout << second::x << '\n';
return 0;
}