目录
1、{}进行初始化
2、auto
3、decltype
4、nullptr
5、范围for循环
6、final和override
结语
前言:
C++通常被分为两个大标准,即C++98和C++11。对于C++98而言,C++11在其基础上做了大量的更改与优化,改动之大以至于C++11更像一门“新语言”,不过C++11确实在使用层面得到了很大的提升,语法更加的稳定安全且功能强大,大幅度的提供了程序员的开发效率。
1、{}进行初始化
在C++98中,大括号一般是用于数组或者结构体的初始化(struct默认成员为公有域,因此可以在外面直接给x和y赋值),示例如下:
#define _CRT_SECURE_NO_WARNINGS 1struct 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 1struct 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类型的元素初始化为0return 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改变了许多。最后希望本文可以给你带来更多的收获!!!