来源:https://blog.csdn.net/a15920804211/article/details/90691525
(1)auto自动类型推导:
auto a; // 错误,auto是通过初始化表达式进行类型推导,假设没有初始化表达式,就无法确定a的类型
auto i = 1;
auto d = 1.0;
auto str = "Hello World";
auto ch = 'A';
auto func = less<int>();vector<int> iv;
auto ite = iv.begin();
auto p = new foo() // 对自己定义类型进行类型推导
template <typename Product, typename Creator>
void processProduct(const Creator& creator)
{
Product* val = creator.makeObject();// do somthing with val
}
template <typename Creator>
void processProduct(const Creator& creator)
{
auto val = creator.makeObject();// do somthing with val
}
(2)decltype从变量或者表达式中获得类型
double tempA = 3.0;
const double ctempA = 5.0;
const double ctempB = 6.0;
const double *const cptrTempA = &ctempA;//const xx *const代表xx类型常量指针,指向的内容也是xx类型常量,指针与内容皆为常量不可更改
/*1.dclTempA推断为const double(保留顶层const,此处与auto不同)*/
decltype(ctempA) dclTempA = 4.1;
/*2.dclTempA为const double,不能对其赋值,编译不过*/
dclTempA = 5;
/*3.dclTempB推断为const double * const*/
decltype(cptrTempA) dclTempB = &ctempA;
/*4.输出为4(32位计算机)和5*/
cout<<sizeof(dclTempB)<<" "<<*dclTempB<<endl;
/*5.保留顶层const,不能修改指针指向的对象,编译不过*/
dclTempB = &ctempB;
/*6.保留底层const,不能修改指针指向的对象的值,编译不过*/
*dclTempB = 7.0;
(3)nullptr引入背景首先了解null关键字在C和C++中的定义:
在C中:
void foo(int a)
{
cout<<"This is int"<<endl;
}
void foo(char * ptra)
{
cout<<"This is pointer"<<endl;
}
int main(void)
{
foo(NULL);
return 0;
}
所以C++11中才会引入nullptr(任何时候都是一个空指针)。
int tempA = 0;
char *ptrTempA = NULL;
char *ptrTempB = nullptr;
/*1.调用foo(int)*/
foo(NULL);
/*2.调用foo(char*)*/
foo(ptrTempA);
foo(nullptr);
foo(ptrTempB);
/*3.此处的0是一个指针,可以进行比较,编译通过*/
if(0 == nullptr){}
/*4.不能将整型和一个指针进行比较,编译不过*/
if(tempA == nullptr){}
/*5.可以进行比较,但是会有告警,NULL可以理解成双重指针,既可以是空指针,又可以是整型0*/
if(tempA == NULL){}
2.序列FOR循环
与java类似
map<string, int> m{{"a", 1}, {"b", 2}, {"c", 3}};
for (auto p : m){
cout<<p.first<<" : "<<p.second<<endl;
}
vector<int> vec;
for(int i=0;i<10;++i) {
vec.push_back(i);
}
for_each(vec.begin(),vec.end() ,[](int i)->void{
cout << i <<" ";
});
3.Lambda表达式
用于定义并创建匿名的函数对象
语法
[函数对象参数] (操作符重载函数参数) mutable 或 exception 声明 -> 返回值类型 {函数体}
传递, 那么形参的类型必须是模板类型或者必须能创建一个 std::function 类似的对象去捕获 lambda 函数.使用 auto 关键字
可以帮助存储 lambda 函数,
auto my_lambda_func = [&](int x) { /* ... */ };
auto my_onheap_lambda_func = new auto([=](int x) { /* ... */ });
C++11中引入了变长參数模板,发明了新的数据类型:tuple,tuple是一个N元组。能够传入1个, 2个甚至多个不同类型的数据
auto t1 = make_tuple(1, 2.0, "C++ 11");
auto t2 = make_tuple(1, 2.0, "C++ 11", {1, 0, 2});
在C++11之前,只有数组能使用初始化列表,各种容器只能这样使用
int arr[3] = {1, 2, 3}
vector<int> v(arr, arr + 3);
int arr[3]{1, 2, 3};
vector<int> iv{1, 2, 3};
map<int, string>{{1, "a"}, {2, "b"}};
string str{"Hello World"};
原文始发于微信公众号(汇编语言):【C++面试知识】C++11新特性
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论