(一)类型推导
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;
}


1747

被折叠的 条评论
为什么被折叠?



