目录
前言:
C++通常被分为两个大标准,即C++98和C++11。对于C++98而言,C++11在其基础上做了大量的更改与优化,改动之大以至于C++11更像一门“新语言”,不过C++11确实在使用层面得到了很大的提升,语法更加的稳定安全且功能强大,大幅度的提供了程序员的开发效率。
1、{}进行初始化
在C++98中,大括号一般是用于数组或者结构体的初始化(struct默认成员为公有域,因此可以在外面直接给x和y赋值),示例如下:
#define _CRT_SECURE_NO_WARNINGS 1
struct A
{
int x;
int y;
};
int main()
{
int arr[] = { 1, 2, 3, 4, 5 };
A p = { 1, 2 };
return 0;
}
当到了C++11,大括号的初始化范围不再局限于数组和结构体,还能够初始化内置类型,并且用大括号进行初始化还可以省略赋值符号‘=’。
#define _CRT_SECURE_NO_WARNINGS 1
struct A
{
int x;
int y;
};
int main()
{
int a{ 2 };//等价于int a = 2/int a = {2}
int array1[]{ 1, 2, 3, 4, 5 };
A p{ 1, 2 };
int* pa = new int[4]{ 0 };//开辟的空间中每个int类型的元素初始化为0
return 0;
}
并且对象也支持{}的初始化,{}会自动调用该对象的构造函数。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class A
{
public:
A(int x1,int y1)
:x(x1)
,y(y1)
{}
void Print()
{
cout << x << " " << y << endl;
}
private:
int x;
int y;
};
int main()
{
//C++98写法
A p2(2,6);
p2.Print();
//C++11写法
A p1 = { 1, 2 };
A p{ 1, 2 };
p1.Print();
p.Print();
return 0;
}
运行结果:

2、auto
在C++11中,auto是可以自动推导类型的,他可以识别等式右边的类型,并且把该类型赋予auto类型的对象。注意:auto定义的对象必须完成初始化
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<map>
using namespace std;
int main()
{
int i = 10;
auto p = &i;
auto pf = strcpy;
//typeid可以观察对象的类型
cout << typeid(p).name() << endl;//指针
cout << typeid(pf).name() << endl;//函数指针
string st1;
auto it = st1.begin();
cout << typeid(it).name() << endl;//迭代器
return 0;
}
运行结果:

3、decltype
decltype可以把一个表达式的类型给到decltype创建的对象。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<map>
using namespace std;
int main()
{
const int x = 1;
double y = 2.2;
decltype(x * y) ret; // ret的类型是double-算术转换
decltype(&x) p;//p的类型是const修饰的指针
cout << typeid(ret).name() << endl;
cout << typeid(p).name() << endl;
return 0;
}
运行结果:

4、nullptr
在C++98中,NULL表示的是字面常量0,因此很不明确,因为0既能表示指针常量又能表示整形常量,很不安全,因此在C++11中引入了nullptr的概念,他只表示空指针。
5、范围for循环
范围for可以帮助程序员便捷的遍历容器内容,他的底层其实是去调用该容器的迭代器来实现的,但是使用起来的确很方便。
范围for的用法:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1(5,1);
for (auto num : v1)
{
cout << num << " ";
}
return 0;
}
运行结果:

6、final和override
final和override也是在C++11时提出的,他们的使用场景主要是多态下的虚函数重写。其中final修饰虚函数,表示该虚函数不能被重写。
final测试代码:
class A
{
public:
virtual void A1() final {}//A1不能被派生类的虚函数发生重写
};
class B :public A
{
public:
virtual void A1() { cout << "A" << endl; }
};
override同样修饰虚函数,他修饰派生类虚函数如果没有重写基类的虚函数则会报错。override测试代码如下:
class A
{
public:
void A1() {}
};
class B :public A
{
public:
virtual void A1()override { cout << "A" << endl; }//A1如果没有重写基类的虚函数则会报错
};
结语
以上就是关于C++11经典用法的讲解,C++11相对于C++98改变了许多。最后希望本文可以给你带来更多的收获!!!
本文介绍了C++11相较于C++98的显著改进,包括大括号的广泛初始化、auto类型的自动推导、decltype获取表达式类型、nullptr代替NULL、范围for循环以及final和override用于多态的虚函数控制。

243

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



