C++11标准 - 声明(auto,decltype,nullptr)
前言
c++11提供了多种简化声明的方式,尤其是在使用模板时。
1. auto
在C++98中auto是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局部的变量默认就是自动存储类型,所以auto就没什么价值了。C++11中废弃auto原来的用法,将其用于实现自动类型腿断。这样要求必须进行显示初始化,让编译器将定义对象的类设置为初始化值的类型。
int main()
{
int i = 10;
auto p = &i;
map<string, string> s{ {"sort", "排序"}, {"insert", "插入"} };
auto it = s.begin();
//typeid 是一个运算符,用于获取表达式的类型信息
cout << typeid(p).name() << endl;
cout << typeid(it).name() << endl;
return 0;
}
2. decltype
在C++中,decltype 是一个关键字,用于获取表达式的类型。它返回表达式的静态类型,并且保留类型的修饰符(例如 const、引用等)。
template<class T1, class T2>
void F(T1 t1, T2 t2)
{
decltype(t1 * t2) ret;
cout << typeid(ret).name() << endl;
}
int main()
{
const int x = 1;
double y = 2.2;
decltype(x * y) ret; // ret的类型是double
decltype(&x) p; // p的类型是int const *
cout << typeid(ret).name() << endl;
cout << typeid(p).name() << endl;
F(1, 'a');
return 0;
}
总而言之,decltype 是一个有用的关键字,可以在编译期间获取表达式的类型,并在类型推断和元编程方面提供更多灵活性。
3. nullptr
由于C++中NULL被定义成字面量0,这样就可能回带来一些问题,因为0既能指针常量,又能表示整形常量。所以出于清晰和安全的角度考虑,C++11中新增了nullptr,用于表示空指针。
使用 nullptr 可以提高代码的可读性,并且在类型安全和重载决议方面比0和NULL更可靠。
int* ptr = nullptr; // 声明一个空指针
void foo(int* ptr) {
if (ptr == nullptr) {
// 执行某些操作,表示ptr为空指针
} else {
// 执行某些操作,表示ptr不为空指针
}
}
class MyClass {
public:
void myMethod() {
// 执行某些操作
}
};
MyClass* obj = nullptr; // 声明一个空指针
if (obj == nullptr) {
// 执行某些操作,表示obj为空指针
} else {
obj->myMethod(); // 调用对象的成员函数,需要先检查指针是否为空
}
在上述示例中,nullptr 用于声明空指针 ptr 和 obj。在条件语句中,使用 nullptr 进行空指针的比较。同时,使用 nullptr 可以明确地表达意图,使代码更加清晰和可靠。
(本章完)