C++——auto、decltype、返回类型后置、模板别名:using =、nullptr

本文介绍了C++11引入的一些重要特性,包括auto关键字用于自动类型推断,decltype用于获取表达式的类型,返回类型后置的函数声明方式,以及模板别名的使用。这些特性简化了代码并提高了类型安全性。示例代码展示了如何在实践中应用这些特性,如使用nullptr替代0以避免类型转换问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.3、声明

1.3.1、auto

以前版本关键字auto是一个存储类型说明符,表示动态存储还是静态存储,与static关键字对应,第九章也写了,C++11将其用实现自动类型推断(第三章)。必须显示初始化,让编译器能够将变量类型设置为初始值的类型。

示例:

#include "iostream"
#include "stdio.h"
#include "string"
using namespace std;
double f(int a,int b){return 0;}
auto pf=f;
int main(int argc,char const *argv[]){
    auto a=1;
    auto b=1.2;
    auto ptr=&a;
    string s="******";
    auto s_begin=s.begin();
    auto c=s;
    
    return 0;
}

auto 不能用于函数形参!!!!如void f(auto x);

1.3.2、decltype

关键字decltype将变量类型声明为表达式指定的类型。比如decltype(x) y 让y类型与新类型相同。示例:

double x;
int n;
decltype(x*n) y;//y是double类型
decltype(&x) z;//z是double *类型
decltype((x)) m;//z是double &类型

1.3.3、返回类型后置

C++11新增了一种语法:在函数名和参数名后面指定返回类型,示例:

auto double(int x,double y)->decltype(x*y){
    return x*y;
}

1.3.4、模板别名:using =

对于冗长或复杂的标识符,如果能够创建其别名将很方便。以前,C++为此提供了typedef:
typedef std::vector< std::string >:: iterator itType;
C++ll提供了另一种创建别名的语法,这在第14章讨论过:
using itType=vector< std::string >:: iterator;
差别在于,新语法也可用于模板部分具体化,但typedef不能:
template< ypenameT>
using arr12 = Std::array<T,12>;
上述语句具体化模板array<T,int>对于下述声明:
std::array<double,12> a1;
std:: array<string,12> a2;
可将它们替换为如下声明:
arr12< double>a1;
arr12(std::string>a2:

1.3.5、nullptr

C++里NULL源码:

#ifndef NULL
    #ifdef __cplusplus
        #define NULL 0
    #else
        #define NULL ((void *)0)
    #endif
#endif

空指针是不会指向有效数据的指针。以前,C++在源代码中使用0表示这种指针,但内部表示可能不同, 这带来了一些问题,因为这使得0即可表示指针常量,又可表示整型常量。正如第12章讨论的,C++11新增了关键字nullptr.用于表示空指针;它是指针类型,不能转换为整型类型·为向后兼容,C++11仍允许使用0来表示空指针,因此表达式nullptr==0为true,但使用nullptr而不是0提供了更高的类型安全。
例如,可将0传递给接受int参数的函数,但如果您试图将nullptr传递给这样的函数,编译器将此视为错误因此,出于清晰和安全考虑,请使用nullptr。

示例:

#include <iostream>
using namespace std;

void func(char *p)
{
    cout << "void func(char *p)" << endl;
}

void func(int p)
{
    cout << "void func(int p)" << endl;
}

int main()
{
    func(NULL);   // 想要调用重载函数 void func(char *p)//实际调用的为void func(int p)
    func(250);    // 想要调用重载函数 void func(int p)
	fuc(nullptr); // 调用void func(char *p)
    return 0;
}

打印结果:

void func(int p)
void func(int p)
void func(char *p)  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值