C++11的新特性:一、auto,decltype,范围循环

(一)类型推导

1.auto

 (1)概念

auto关键字用于自动类型推导,即可以根据初始化的值,在编译时推导出变量名的类型。这使得代码更加简洁。

auto x = 5;//x=>int 
auto ip = new auto(1);// ip=>int*  auto=>int
const auto* p = &x;//auto=>int

auto y;//err 使用时必须赋初值
auto arr[2]={12,23};//err 无法定义数组
struct student
{
    auto val=10;//err 无法定义非静态成员变量
}

(2)auto的二义性

在某些情况下,auto关键字在C++中可能会引起类型推导上的不确定性或冲突。例如:多个同名函数,模板与auto的结合,初始化列表等

auto func();
auto func(int);
template<typename T> 
auto add(T t, T u) 
{ 
    return t + u; //如果T是一个复杂的表达式或模板类型,可能会导致类型推导不明确。
}

(3)auto推导函数的返回类型

template<class T>
T Max(T a, T b)
{
	return a > b ? a : b;
}

int main()
{
	int a = 23, b = 65;
	auto max = Max(a, b);
	return 0;
}

(4)auto作为函数的形参

在过去的C++标准中,用auto作为形参是不合法的,但在新升级后的C++标准中,可以这么使用,

在VS2022中,可以如下修改:

void Print(auto& ar)
{
	for (auto& x : ar)
	{
		cout << x << " ";
	}
}

int main()
{
	int ar[] = { 1,2 };
	Print(ar);
	return 0;
}

(5)auto的cv属性

int main()
{
    int x=0;
    
    const auto e=x;// e->const int
    auto f=e;// f->int

    const auto &g=x;//g->const int&
    auto &h=g;//h->const int &
}

 当不声明为指针或者引用时,auto推导的结果和初始化表达式抛弃引用和cv限定修饰符后类型一致。

当声明为指针或者引用时,auto的推导结果将保持初始化表达式的cv属性。 

2.decltype

(1)概念

decltype用于在编译时期获取表达式的数据类型。与auto不同的是,decltype在使用时,不需要对变量初始化,而且decltype不会对表达式进行求值,而是仅用于类型推导。

int Add(int a,int b)
{
    return a+b;
}

int main()
{
    int a = 10, b = 20;
	decltype(a) x;
	decltype(a + b) y;
	decltype(Add(a, b)) z;//在编译时根据表达式的类型,推导出变量名的类型,不调用Add函数

}

 (2)decltype的cv属性

与auto不同,decltype可以精确地推导出表达式的类型,将保持初始化表达式的cv属性。 

(二)基于范围的for循环

在C98中,不同的容器和数组,遍历的方法不尽相同,写法不统一,而在C++11中,基于范围的for循环以一个更统一简洁的方式来遍历。

for(ElemType val : array)
{
    //statement 循环体
}

例如:


int ar[] = {11,22,33,44};
	for (int x : ar)
	{
		cout << x << " ";
	}

还可以将auto与其结合起来:

template<class T>
void Print(T &ar)//
{
	for (auto x : ar)
	{
		cout << x << " ";
	}
}

 (三)指针空值——nullptr

nullptr用于表示空指针常量。它是一个指针字面量,类型为null_ptr,与0或NULL不同,它不能被隐式转换为非指针类型,这减少了类型转换错误的可能性。

int a=nullptr;//err
int *p=nullptr;//ok
char *q=nullptr;//ok

  (四)typedef与using

typedef unsigned int uint;
using uint=unsigned int;

 (五)string

string 是 C++ 中处理字符串的标准方式,它提供了安全、便捷的方法来进行字符串操作。

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;//命名空间,解决命名污染问题

int main()
{
	string s1 = "hello";

	for (int i = 0; i < s1.size(); i++)//s1.length()
	{
		cout << s1[i];
	}
	cout << endl;

	s1 += "abc";
	cout << s1 << endl;

	cin >> s1;//空格为中止
	cout << s1 << endl;
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值